IIC-用IO口模拟IIC时序,实现与24C02通信

文章目录

  • 前言
  • 参考了的文章
  • IIC
    • 状态
    • 中间的数据是怎么传输的?
  • 关于实际读写
  • 关于24C02

前言

这几天都在自学,一个多星期了,是时候把知识都归类总结一下了。

参考了的文章

链接: IIC 通讯协议.这篇文章写得非常的生动,值得借鉴。
链接: IIC总线协议.这篇文章图文并茂,比较好理解。
链接: IIC ACK信号.这篇讲ACK信号的。

IIC

IIC是一种两线式的串行总线
构成:
时钟SCL和数据线SDA

状态

空闲态: SCL和SDA都处于高电平
起始信号: 在SCL为高电平时,SDA电平由高变低
结束信号: 在SCL为高电平时,SDA电平由低变高

中间的数据是怎么传输的?

有了起始信号和结束信号,中间的信号怎么传输呢?
首先,在SDA上传输数据的话就必须保证在SCL在高电平的时候保持稳定。
用一段代码来讲一下吧。我觉得结合代码会比较好理解。

发送数据。

void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
	SDA_OUT(); 	    // 设置为输出模式
    IIC_SCL=0;		// SCL在低电平的时候不管SDA是高是低都无效
    for(t=0;t<8;t++)  
    {              
		if((txd&0x80)>>7)
			IIC_SDA = 1;
		else
			IIC_SDA = 0;			
        txd<<=1; 	  //排第二的高有效位左移一位准备被发送
		delay_us(2);   //对TEA5767这三个延时都是必须的
		IIC_SCL=1;    // SCL拉高,保证数据发送的时候是稳定的
		delay_us(2); 
		IIC_SCL=0;	    //发完之后SCL可以拉低
		delay_us(2);
    }	 
} 

对,也可以理解为SCL在低电平的时候不管SDA是高是低都无效。也就是只有SCL在高电平的时候SDA的高低电平(1或者0)才会有效。

然后记得要先发最高有效位,就像代码里面那样子操作。

关于ACK响应信号

响应信号(ACK):处理器把数据发给外接IIC设备,如何知道IIC设备数据已经收到呢?就需要外接IIC设备回应一个信号给处理器。处理器发完8bit数据后就不再驱动总线了(SDA引脚变输入),而SDA和SDL硬件设计时都有上拉电阻,所以这时候SDA变成高电平。那么在第8个数据位,如果外接IIC设备能收到信号的话接着在第9个周期把SDA拉低,那么处理器检测到SDA拉低就能知道外接IIC设备数据已经收到。
————————————————
版权声明:本文为CSDN博主「zailushangha」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zailushangha/article/details/8233448

根据这段话,再结合一下代码。

//产生ACK应答
void IIC_Ack(void)  
{
	IIC_SCL=0;   
	SDA_OUT();		//设置为输出模式
	IIC_SDA=0;  
	delay_us(2); 
	IIC_SCL=1;  
	delay_us(2); 
	IIC_SCL=0;	
}
//不产生ACK应答		                                    
void IIC_NAck(void)  
{
	IIC_SCL=0;
	SDA_OUT();  //设置为输出模式
	IIC_SDA=1;	
	delay_us(2);
	IIC_SCL=1;    
	delay_us(2);
	IIC_SCL=0;

就是如果想产生应答的话就应该把SDA拉低,如果不产生应答的话就保持SDA高电平。

关于实际读写

参考链接2
链接: IIC总线协议.这篇文章图文并茂,比较好理解。

图文讲解,而且是以AT24Cxx为例子的。

关于24C02

从它的数据手册里面扒出来一点东西
IIC-用IO口模拟IIC时序,实现与24C02通信_第1张图片

对于24C02的话,它只有2K,对应的就是第一个行。
高四位是固定的1010,低四位里面最后一位是用来读写用的,R=1、W=0。
也就是说8个位里面只有7个是地址位,而且7个位里面有4个位是固定的,也就是说最大的寻址范围肯定小于2^7 = 256。

你可能感兴趣的:(IIC-用IO口模拟IIC时序,实现与24C02通信)