如题所用的芯片,主频配置为80M,IIC外设外挂的EEPROM器件型号为MicroChip公司的24LC64,配置IIC模块波特率为100K。当启动写命令时,无法接收到EERPOM器件回发的ACK信号,观察示波器上SCL和SDA波形,看起来是IIC模块在发送完控制字节后,第9个时钟时还没有释放SDA信号线,导致EEPROM器件回发ACK时在SDA线上出现冲突,如下图所示:
配置使用的库函数为: I2C_MasterInit(I2C_0_PERIPHERAL, &I2C_0_config, CLOCK_GetFreq(I2C_0_CLKSRC));
其中I2C_0_config的定义如下:
const i2c_master_config_t I2C_0_config = {
.enableMaster = true,
.enableStopHold = false,
.baudRate_Bps = 100000,
.glitchFilterWidth = 0
};
启动发送命令时调用的库函数如下:
IIC_Master_transfer.slaveAddress = 0x50; //Eeprom设备地址,配置时会左移一位,最低位指示是读还是写
IIC_Master_transfer.direction = kI2C_Write;
IIC_Master_transfer.subaddress = iicaddr; //数据地址
IIC_Master_transfer.subaddressSize = 2; //数据地址字节长度
IIC_Master_transfer.data = pdata; //发送数据结构体
IIC_Master_transfer.dataSize = datasize; //发送数据长度
IIC_Master_transfer.flags = kI2C_TransferDefaultFlag;
I2C_MasterTransferNonBlocking(I2C_0_PERIPHERAL, &IIC_Master_Handle, &IIC_Master_transfer);
使用的iic库函数文件如附件所示,我想问是我配置哪里还有问题,导致无法接受到ACK信号吗
楼主你好!
你理解有点问题,其实第9位,主机是会拉高,如果有ACK, 是由从机去拉低的实现ACK的。
所以,你还要查看下你的从机地址,尤其总线上的从机地址是不是你从机设备的地址,另外,我建议你可以放低点波特率测试会看看,比如10K。
还有,你的I2C引脚是否是真开漏,上拉加了多少?
Have a great day,
Kerry
-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------
确实是引脚没有配置成开漏导致的,目前读写正常了