?? 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 + -