您的位置 首页 分销

stm8s开发(八) IIC的运用:IIC主机通讯!

前面讲过两个常用的串口,UART和SPI,这次这次讲解一下另一个常用的串口:IIC(I2C)通信科普IIC:一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到IIC总线

  前面讲过两个常用的串口,UART和SPI,这次这次解说一下另一个常用的串口:IIC(I2C)通讯

  科普IIC:一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。一切接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。

  通讯进程:

  主形式时,IIC接口发动数据传输并发生时钟信号。串行数据传输总是以开端条件开端并以中止条件完毕。开端条件和中止条件都是在主形式下由软件操控发生。

  从形式时,IIC接口能辨认它自己的地址(7位或10位)和播送呼叫地址。软件能够操控敞开或制止播送呼叫地址的辨认。

  数据和地址按8位/字节进行传输,高位在前。跟在开端条件后的1或2个字节是地址(7位形式为1个字节,10位形式为2个字节)。地址只在主形式发送。

  在一个字节传输的8个时钟后的第9个时钟期间,接纳器有必要回送一个应对位(ACK)给发送器。参阅下图。

    

 

  具体协议能够参阅:http://blog.csdn.net/subkiller/article/details/6854910

  和SPI差不多,运用IIC无非就一个初始化,一个数据发送,一个数据接纳,三大功用。

  初始化分初始化为主机、从机,不过一般和外部芯片通讯单片机都是作为主机。

  void IIC_Master_Init(void)

  {

  CLK_PCKENR1 |= 0x01; //使能IIC外设时钟

  PB_DDR &= 0xcf;

  PB_CR1 &= 0xcf;

  PB_CR2 &= 0xcf;

  I2C_CR1 = 0x00; //答应时钟延展,制止播送呼叫,制止iic

  I2C_FREQR = 0x01; //输入时钟频率8MHz

  I2C_OARH = 0x40; //七位地址形式

  I2C_OARL = 0xa0; //本身地址0xa0

  I2C_CCRL = 0xff; //

  I2C_CCRH = 0x00; //规范形式

  I2C_TRISER = 0x02;

  I2C_CR1 |= 0x01; //使能iic外设

  }

  这儿运用的是STM8S105片上的IIC引脚PB4、PB5。别的便是需求使能IIC的时钟。

  发送和接纳数据这儿只给出一个最简略的比如,由于不同的外部芯片的通讯方法不一样,不过一般都是:

  读操作:开端 -> 发送外设地址 -> 开端 ->发送需求读取的寄存器地址 -> 读一个字节 -> (或许再读一个字节) ->。。。 -> 完毕

  写操作:开端 -> 发送外设地址 -> 发送需求写入的寄存器地址 -> 写一个字节 ->

  void IIC_Write_Byte(u8 DeviceAddress, u8 Address, u8 Data)

  {

  vu8 temp = 0;

  while((I2C_SR3 & 0x02) != 0); //等候IIC总线闲暇

  IIC_Start();

  while((I2C_SR1 & 0x01) == 0); //EV5,开端信号现已发送

  I2C_DR = (DeviceAddress & 0xfe); // 发送iic从器材物理地址,最低位0,写操作

  while((I2C_SR1 & 0x02) == 0); //地址现已被发送

  temp = I2C_SR1; //铲除ADDR标志位

  temp = I2C_SR3;

  while((I2C_SR1 & 0x80) == 0); //等候发送寄存器为空

  I2C_DR = Address; //发送要写入的寄存器地址

  while((I2C_SR1 & 0x04) == 0); //等候发送完结

  while((I2C_SR1 & 0x80) == 0); //等候发送寄存器为空

  I2C_DR = Data; //发送要写入的数据

  while((I2C_SR1 & 0x04) == 0); //等候发送完结

  temp = I2C_SR1; //清零BTF标志位

  temp = I2C_DR;

  IIC_Stop(); //发送中止信号

  }

  unsigned char IIC_Read_Byte(u8 DeviceAddress, u8 Address)

  {

  vu8 temp = 0;

  short read_data = 0;

  while((I2C_SR3 & 0x02) != 0); //等候IIC总线闲暇

  I2C_CR2 |= 0x04; //使能ACK

  IIC_Start();

  while((I2C_SR1 & 0x01) == 0); //EV5,开端信号现已发送

  I2C_DR = (DeviceAddress & 0xfe); // 发送iic从器材物理地址,最低位0,写操作

  while((I2C_SR1 & 0x02) == 0); //地址现已被发送

  temp = I2C_SR1; //铲除ADDR标志位

  temp = I2C_SR3;

  while((I2C_SR1 & 0x80) == 0); //等候发送寄存器为空

  I2C_DR = Address; // 发送要读取的寄存器地址

  while((I2C_SR1 & 0x04) == 0); //等候数据发送完结

  IIC_Start();

  while((I2C_SR1 & 0x01) == 0); //EV5,开端信号现已发送

  I2C_DR = (DeviceAddress | 0x01); // 发送iic从器材物理地址,最低位1,读操作

  while((I2C_SR1 & 0x02) == 0); //地址现已被发送

  temp = I2C_SR1; //铲除ADDR标志位

  temp = I2C_SR3;

  while((I2C_SR1 & 0x40) == 0); //等候接纳数据寄存器非空

  read_data = I2C_DR;

  I2C_CR2 &= 0xfb; //读取数据下,发送stop有必要制止ack,才干开释从机

  temp = I2C_SR1; //清零BTF标志位

  temp = I2C_DR;

  IIC_Stop();

  return read_data;

  }

  附上stm8s在IAR环境下的项目工程,包含了SPI、I%&&&&&%、PWM、AWU、USART、EEPROM等片上硬件的初始化代码。

  http://download.csdn.NET/detail/devintt/9454188

  读操作:开端 -> 发送外设地址 -> 开端 ->发送需求读取的寄存器地址 -> 读一个字节 -> (或许再读一个字节) ->。。。 -> 完毕

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/184075.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部