工具/软件:TI C/C++编译器
大家好,我正在为I2C接口编写代码。
下面是我的I2C读写代码
void I2C_setup (I2C_HANDLE i2cHandle)
{
i2cHandle->I2CSAR = 0x0050;// EEPROM控制代码的从属地址
i2cHandle->I2CPsc.all =7;// Prescaler -需要7~12 MHz的模块时钟
i2cHandle->I2CCLKL =20;//注意:必须为非零
i2cHandle->I2CCLKH =10;//注意:必须为非零
i2cHandle->I2CFFTX.ALL = 0x6040;//启用FIFO模式和TXFIFO
i2cHandle->I2CFFRX.ALL = 0x2040;//启用RXFIFO,清除RXFFINT
i2cHandle->I2CMDR.ALL = 0x0020;//从重置中取出I2C
}
void I2C_Write (uint16_t sAddr,uint16_t addr,uint16_t数据)
{
HAL_Obj* OBJ =(HAL_Obj*)halHandle;
uINT16_t msbAddr;
uINT16_t地址;
char slaver_addr;
slaver_addr =(sAddr >> 1)和0x7F;
msbAddr =(0x0300和addr)>> 8;
地址=地址和0x00FF;
slaver_addr = slaver_addr | msbAddr;
obj->i2cHandle->I2CSAR = slaver_addr;
obj->i2cHandle->I2CCNT =2;
obj->i2cHandle->I2CDXR =地址和0x00FF;
obj->i2cHandle->I2CDXR =数据和0x00FF;
obj->i2cHandle->I2CMDR.All = 0x2E20;
while (!obj->i2cHandle->I2CSTR.bit.scd)
;
obj->i2cHandle->I2CSTR.bit.scd = 1;
}
uINT16_t I2C_READ (uint16_t sAddr,uint16_t addr)
{
HAL_Obj* OBJ =(HAL_Obj*)halHandle;
UINT16_t RDATA;
uINT16_t msbAddr;
uINT16_t地址;
char slaver_addr;
slaver_addr =(sAddr >> 1)和0x7F;
msbAddr =(0x0300和addr)>> 8;
地址=地址和0x00FF;
slaver_addr = slaver_addr | msbAddr;
whil(obj->i2cHandle->I2CSTR.bit.bB)
;
whit(obj->i2cHandle->I2CMDR.bit.stp)
;
obj->i2cHandle->I2CSAR = slaver_addr;
obj->i2cHandle->I2CCNT =1;
obj->i2cHandle->I2CDXR =地址和0x00FF;
obj->i2cHandle->I2CMDR.All = 0x2620;
while (!obj->i2cHandle->I2CSTR.bit.ARDY)
;
obj->i2cHandle->I2CCNT =1;
obj->i2cHandle->I2CMDR.All = 0x2C20;
while (!obj->i2cHandle->I2CSTR.bit.scd)
;
RDATA = obj->i2cHandle->I2CDRR;
返回(RDATA和0x00FF);
}
下面是访问EEPROM的代码。
I2C_Write (I2C_EEPROM_ADDR,0,0x34);
usDelay(5万);
数据= I2C_READ (I2C_EEPROM_ADDR,0);
UARTprintf ("数据=%d\n",数据);
此代码工作正常。 但是,代码不会延迟地卡在读取中,等待SCD为1。
此时I2CSTR为0x1406。
我需要你的帮助。
提前感谢。
