IIC的一些心得

											  		IIC

这里不是讲IIC的原理,原理啥的很多地方都有
就是我看到原子哥的代码是针对24C02的IIC写的,其实IIC规定的协议都是通一的,可以相互移植,但是原子哥的代码什么函数名都是对24c02不好移植,所以就打算自己写一个方便移植IIC代码,用原子哥F4探索者开发板,代码的注释我已经标的尽可能详细了,所以就不在这里重复。
可以和正点原子的代码进行对比,实际上是一样的,我就是把函数的封装给来了,更方便移植。对于IO口的改变只需要改几个数就行,很方便。
IIC通信一些需要注意的地方
1.记住首先传输的是数据的最高位

void IIC_SendByte(uint8_t data)
{                        
    uint8_t t;   
	  SDA_OUT(); 	    
    IIC_SCL_L; //拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
      if((data&0x80)>>7)                   //先发的是最高位
				IIC_SDA_H;
			else
				IIC_SDA_L;
      data<<=1;
			delay_us(1);			
		  IIC_SCL_H;
		  delay_us(1);
			IIC_SCL_L;	
		  delay_us(1);
    }	 
} 	 

2.从机发数据也是从最高位开始一位位发所以注意接收的代码移位

uint8_t IIC_ReadByte(uint8_t ack)
{
		uint8_t i,receive=0;
	SDA_IN(); 
  for(i=0;i<8;i++ )
	{
     IIC_SCL_L; 
     delay_us(1);
		 IIC_SCL_H;
     receive<<=1;				  //这个二行代码就先接收最高位数据
     if(READ_SDA)receive++;   //然后逐渐移位,把最高位数据放在最高位
	   delay_us(1); 		
   }					 
    if(ack)
        IIC_Ack(); //发送ACK 
    else
        IIC_NAck(); //发送nACK  
    return receive;
}

对于代码的一些解释
1.

uint8_t IIC_ReadByteFromSlave(uint8_t I2C_Addr,uint8_t reg,uint8_t *buf)
{
	IIC_Start();	
	IIC_SendByte(I2C_Addr<<1|0);	 //发送从机地址
……
IIC_SendByte(I2C_Addr<<1|1); //进入接收模式	
}

这里
I2C_Addr<<1|0 说明我们只写7位Addr,然后读写位代码自己给我们加上
比如在开发板中AT24C02 的地址为1010000X,所以addr我们直接写值0xA0就行
2.
几个函数的区别

uint8_t IIC_WriteMultByteToSlave
uint8_t IIC_ReadMultByteFromSlave

这两个为一组,这两个函数一直对一个寄存器进行操作,用于16bit或32bit的寄存器

void AT24CXX_Read 
void AT24CXX_Write

这两个为一组,这两个是对8bit的寄存器进行多次的写入读出,每次寄存器地址都会加一

你可能感兴趣的:(IIC的一些心得)