关于I2C总线模拟程序

来源:百度知道 编辑:UC知道 时间:2024/06/26 04:33:48
请问那个ACK响应位在编程中怎么处理,是发完8个字节后的下一个时钟我把SDA置高接收端就自动发个低电平,还是也要我自己将之拉低?请具体点,我是新手不太懂,谢谢!
另外如果是从机自动发的低电平响应位,那么它是怎么判断应该发响应呢,是主机发完8字节数据后的SCL线第一次变低为信号还是我将SDA拉高时为信号?

1、接收从机的ACK信号,把SDA置高是为了读取ACK信号,你必须要再送一个SCK时钟信号,从机才会发送低电平的ACK信号给主机。IIC是主从式同步通信,主机必须要发送时钟来同步数据位。
2、读取ACK位,只要在ACK的SCK时钟内读SDA,为低就是从机发送了ACK,为高从机没有应答,这时要重新发送一遍数据。
3、通过停止IIC总线结束传输。
4、建议到网上搜点关于iic的pdf资料。
实例代码如下:
//IIC存储器函数
void iic_wait(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}

void iic_stop(void)
{
SDA=0;
SCL=0;
iic_wait();
SCL=1;
iic_wait();
SDA=1;
}

void iic_start(void)
{
SDA = 1;
SCL = 1;
iic_wait();
SDA = 0;
iic_wait();
SCL = 0;
}

void iic_ack(void)
{
SDA=0;
iic_w