这个也是iic总线结构!
在此总结一下iic的程序结构
在同一个函数内读、写操作(以读eeprom为例)
(1)开启总线
(2)写地址字,等待回应(写命令)
(3)写要读的地址,等待回应
(4)再次开启总线
(5)写地址字,等待回应(读命令)
(6)读要读的地址
(7)发出回应
(8)结束总线
放上代码:
unsigned char read_eeprom(unsigned char add)
{
unsigned char dat;
IIC_Start(); //(1)开启总线
IIC_SendByte(SlaveAddrW); //(2)写地址字,等待回应(写命令)
IIC_WaitAck();
IIC_SendByte(add); //(3)写要读的地址,等待回应
IIC_WaitAck();
IIC_Start(); //(4)再次开启总线
IIC_SendByte(SlaveAddrR); //(5)写地址字,等待回应(读命令)
IIC_WaitAck();
dat = IIC_RecByte(); //(6)读要读的地址
IIC_Ack(0); //(7)发出回应
IIC_Stop(); //(8)结束总线
return dat;
}
写eeprom的过程与PCF8591一样
void write_eeprom(unsigned char add,unsigned char dat)
{
IIC_Start();
IIC_SendByte(SlaveAddrW); //地址字
IIC_WaitAck();
IIC_SendByte(add); //传要写的地址
IIC_WaitAck();
IIC_SendByte(dat); //要写的数字
IIC_WaitAck();
IIC_Stop(); //结束
somedelay(10); //适当延时
}
现在总结一下I2C官方驱动中的坑:
(1)需要改延时为33个nop
(2)读数据后的主机发出的回应是ack(0)
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』