📄 i2c.c
字号:
//i2c.c
#include "BasicDefinition.h"
#define K_RECEIVE_SIZE 64
BYTE Buffer[128];
void I2cInitForAic23(void)
{
I2CMDR1 = 0x4e20;
I2COAR = 0x0000;//don't care if master。当从模式时表示DSP的slaveaddress
I2CPSC = 0x2056;
I2CCLKL = 0x0f;
I2CCLKH = 0x0f;
I2CMDR1 |= 0x200;//TRX位设置为1,即设置为传输模式
I2CCNT = 2;//发送长度为2字节,Aic23的命令长度为1个字
I2CSAR = 0x1a;//设置从设备的地址
I2CMDR1 |= 0x400;//MST设置为1,打开主模式
//第1种传输模式 // S-A-D..(n)..D-P mode
//I2CMDR1 &= 0xff7f;//RM位为0,不使用重复模式
//I2CMDR1 |= 0x0800;//STP位为1,有自动停止位
}
int I2cWriteAic23(unsigned int *data)
{
unsigned int i,j;
unsigned int m_nStatus = 1;
I2CMDR1 |= 0x0e00;
for(j=0;j<30;j++)
{
for (i=0;i<K_TIME_OUT;i++)//check for bus busy
{
m_nStatus = I2CSTR & 0x1000;//通过BB位来判断是否Busy
if(m_nStatus == 0)break;
}
}
if(i >= K_TIME_OUT)//bus busy timeout error
return 1;
I2CDXR = *data++;//传输第1个数
I2CMDR1 |= 0x2000;//将STT位设置为1,产生起始条件
for (i=0;i<K_TIME_OUT;i++)//check for NACK status
{
m_nStatus = I2CSTR & 0x2;//通过NACK位来判断是否收到应答信号
if(m_nStatus == 0)break;
}
if(i >= K_TIME_OUT)//No acknowledge bit is set, NACK error
return 3;
for (i=0;i<K_TIME_OUT;i++)//check for DXR status,看发送寄存器是否能够存放数据
{
m_nStatus = I2CSTR & 0x0010;
if(m_nStatus == 0x0010)break;
}
if(i >= K_TIME_OUT)//time out for transmit DXR ready
return 4;
I2CDXR = *data++;//传输第2个数
for(j=0;j<30;j++)
{
for(i=0;i<K_TIME_OUT;i++)//通过NACK位来判断是否收到应答信号
{
m_nStatus = I2CSTR & 0x2;//通过NACK位来判断是否收到应答信号
if(m_nStatus == 0)break;
}
}
if (i >= K_TIME_OUT)//No acknowledge bit is set, NACK error
return 5;
return 0;
}
void I2cInitForEEPROM(void)
{
I2CMDR1 = 0x4620;
I2COAR = 0x0000;//don't care if master。当从模式时表示DSP的slaveaddress
I2CPSC = 0x2056;
I2CCLKL = 0x3f;
I2CCLKH = 0x3f;
I2CMDR1 |= 0x200;//TRX位设置为1,即设置为传输模式
//I2CCNT = 1;
I2CSAR = 0x50;//设置从设备的地址
I2CMDR1 |= 0x400;//MST设置为1,打开主模式
//第1种传输模式 // S-A-D..(n)..D-P mode
//I2CMDR1 &= 0xff7f;//RM位为0,不使用重复模式
I2CMDR1 |= 0x0800;//STP位为1,有自动停止位
}
UINT SequentialRead(FILE* fp,UINT FileSize)
{
unsigned int i,j;
unsigned int m_nStatus = 0;
BYTE TmpBuf1,TmpBuf2;
UINT m_bError = 0;//没有错误
I2CMDR1 = 0x4420;
I2CCNT = FileSize;//接收10个字节
I2CMDR1 |= 0x2000;//将STT位设置为1,产生起始条件
for(j=0;j<FileSize;j++)
{
for (i=0;i<K_TIME_OUT;i++)//check for DRR status,看接收寄存器是否已经收到数据
{
m_nStatus = I2CSTR & 0x0008;
if(m_nStatus == 0x0008)break;
}
if(i >= K_TIME_OUT)//time out for transmit DXR ready
return 0xffff;
TmpBuf1 = I2CDRR;
TmpBuf2 = fgetc(fp);
if(TmpBuf1 != TmpBuf2)
m_bError = 0xfffe;
}
I2CMDR1 |= 0x0800;//STP位设置为1,产生停止条件
return m_bError;
}
UINT AT24SetAddress(UINT DataAddr)
{
UINT i;
UINT m_nStatus = 1;
UINT TmpBufAddr = DataAddr;
I2CMDR1 = 0x4620;//注意不要STOP
I2CCNT = 2;
//I2CMDR1 |= 0x0e00;
for (i=0;i<K_TIME_OUT;i++)//check for bus busy
{
m_nStatus = I2CSTR & 0x1000;//通过BB位来判断是否Busy
if(m_nStatus == 0)break;
}
if(i >= K_TIME_OUT)//bus busy timeout error
return 1;
I2CDXR = (BYTE)(TmpBufAddr>>8);//((BYTE*)(&TmpBufAddr))[1];//传输第1个数
I2CMDR1 |= 0x2000;//将STT位设置为1,产生起始条件
for (i=0;i<K_TIME_OUT;i++)//check for NACK status
{
m_nStatus = I2CSTR & 0x2;//通过NACK位来判断是否收到应答信号
if(m_nStatus == 0)break;
}
if(i >= K_TIME_OUT)//No acknowledge bit is set, NACK error
return 3;
for (i=0;i<K_TIME_OUT;i++)//check for DXR status,看发送寄存器是否能够存放数据
{
m_nStatus = I2CSTR & 0x0010;
if(m_nStatus == 0x0010)break;
}
if(i >= K_TIME_OUT)//time out for transmit DXR ready
return 4;
I2CDXR = (BYTE)(TmpBufAddr);//((BYTE*)(&TmpBufAddr))[0];//传输第2个数
for(i=0;i<K_TIME_OUT;i++)//通过NACK位来判断是否收到应答信号
{
m_nStatus = I2CSTR & 0x2;//通过NACK位来判断是否收到应答信号
if(m_nStatus == 0)break;
}
if (i >= K_TIME_OUT)//No acknowledge bit is set, NACK error
return 5;
return 0;
}
UINT AT24PageWrite(BYTE* InputBuf,UINT addr)
{
unsigned int i,j;
unsigned int m_nStatus;
UINT TmpAddr = addr;
I2CMDR1 |= 0x0e00;
I2CCNT = K_CURRENT_PAGE_SIZE + 2;//发送数据的长度(包括了地址)
for(j=0;j<30;j++)
{
for (i=0;i<K_TIME_OUT;i++)//check for bus busy
{
m_nStatus = I2CSTR & 0x1000;//通过BB位来判断是否Busy
if(m_nStatus == 0)break;
}
}
if(i >= K_TIME_OUT)//bus busy timeout error
return 1;
I2CDXR = (BYTE)(TmpAddr>>8);//((BYTE*)(&TmpAddr))[0];//0x00;//写地址的高位
I2CMDR1 |= 0x2000;//将STT位设置为1,产生起始条件
for (i=0;i<K_TIME_OUT;i++)//check for NACK status
{
m_nStatus = I2CSTR & 0x2;//通过NACK位来判断是否收到应答信号
if(m_nStatus == 0)break;
}
if(i >= K_TIME_OUT)//No acknowledge bit is set, NACK error
return 3;
for (i=0;i<K_TIME_OUT;i++)//check for DXR status,看发送寄存器是否能够存放数据
{
m_nStatus = I2CSTR & 0x0010;
if(m_nStatus == 0x0010)break;
}
if(i >= K_TIME_OUT)//time out for transmit DXR ready
return 4;
I2CDXR = (BYTE)(TmpAddr);//((BYTE*)(&TmpAddr))[1];//0x00;//写地址的低位
for(i=0;i<K_TIME_OUT;i++)//通过NACK位来判断是否收到应答信号
{
m_nStatus = I2CSTR & 0x2;//通过NACK位来判断是否收到应答信号
if(m_nStatus == 0)break;
}
if (i >= K_TIME_OUT)//No acknowledge bit is set, NACK error
return 5;
for (i=0;i<K_TIME_OUT;i++)//check for DXR status,看发送寄存器是否能够存放数据
{
m_nStatus = I2CSTR & 0x0010;
if(m_nStatus == 0x0010)break;
}
if(i >= K_TIME_OUT)//time out for transmit DXR ready
return 4;
for(j=0;j<K_CURRENT_PAGE_SIZE;j++)//写剩余的数据
{
I2CDXR = *InputBuf++;
for(i=0;i<K_TIME_OUT;i++)//通过NACK位来判断是否收到应答信号
{
m_nStatus = I2CSTR & 0x2;//通过NACK位来判断是否收到应答信号
if(m_nStatus == 0)break;
}
if (i >= K_TIME_OUT)//No acknowledge bit is set, NACK error
return 5;
for (i=0;i<K_TIME_OUT;i++)//check for DXR status,看发送寄存器是否能够存放数据
{
m_nStatus = I2CSTR & 0x0010;
if(m_nStatus == 0x0010)break;
}
if(i >= K_TIME_OUT)//time out for transmit DXR ready
return 4;
}
return 0;
}
void CheckProgStatus(void)
{
UINT i;
UINT m_bIdle = 0;
UINT m_nStatus;
I2CMDR1 |= 0x0e00;
I2CMDR1 &= 0xf7ff;
I2CCNT = 0;
I2CMDR1 |= 0x2000;//将STT位设置为1,产生起始条件
while(1)
{
for (i=0;i<K_TIME_OUT;i++)//check for NACK status
{
m_nStatus = I2CSTR & 0x2;//通过NACK位来判断是否收到应答信号
if(m_nStatus == 0)
{
m_bIdle = 1;
break;
}
}
if(m_bIdle == 0)
I2CMDR1 |= 0x2000;//将STT位设置为1,产生起始条件
else
{
generate_stop_condition;
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -