STM32硬件IIC和模拟llc有什么区别解析

电子常识

2640人已加入

描述

  STM32的硬件IIC远没有硬件SPI好用,模拟IIC的,因为之前只用过51的准双向口控制过简单的IIC器件,所以好好看了下。

  IIC总线是由数据线SDA和时钟线SCL两条线构成的通信线路,既可以发送数据,也可以接收数据。在MCU和被控IC之间,IC和IC之间都可以进行双向传输。

  IIC

  这是一个IIC总线系统硬件结构图,SCL和SDA均需接上拉电阻。

  在模拟IIC总线通信时,需写出几个关键部分的函数。

  #define IIC_SCL PCout(12) //SCL

  #define IIC_SDA PCout(11) //SDA

  #define READ_SDA PCin(11)

  (1):总线初始化

  void IIC_Init(void)

  {

  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //将PC12和PC11设置为通用推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOC, &GPIO_InitStructure);

  IIC_SCL=1;

  IIC_SDA=1; //将SCL和SDA都拉高以释放总线

  }

  (2):产生启动信号:


  当SCL为高的时候,SDA高电平跳变到低电平

  void IIC_Start(void)

  {

  SDA_OUT(); //配置SDA为通用推挽输出模式

  IIC_SDA=1;

  IIC_SCL=1;

  delay_us(4);

  IIC_SDA=0;

  delay_us(4);

  IIC_SCL=0; //钳住IIC总线,准备发送和接收数据

  }

  (2):产生停止信号:


  当SCL为高的时候,SDA低电平跳变到高电平

  void IIC_Stop(void)

  {

  SDA_OUT(); //配置SDA为通用推挽输出模式

  IIC_SCL=0;

  IIC_SDA=0;

  delay_us(4);

  IIC_SCL=1;

  IIC_SDA=1;

  delay_us(4);

  }

  (3)等待应答信号:


  返回1:接收应答成功,返回0:接受应答失败

  #define READ_SDA PCin(11)

  u8 IIC_Wait_Ack(void)

  {

  u8 temp=0;

  SDA_IN(); //配置SDA为上拉/下拉输入模式

  IIC_SDA=1;delay_us(1);

  IIC_SCL=1;delay_us(1);

  while(READ_SDA)

  {

  ucErrTime++;

  if(temp》250)

  {

  IIC_Stop();

  return 1;

  }

  }

  IIC_SCL=0;

  return 0;

  }

  (3)产生一个应答信号:


  当SDA为低电平的时候,SCL从高电平跳变到低电平

  void IIC_Ack(void)

  {

  IIC_SCL=0;

  SDA_OUT();

  IIC_SDA=0;

  delay_us(2);

  IIC_SCL=1;

  delay_us(2);

  IIC_SCL=0;

  }

  (4)产生一个不应答信号:


  当SDA为高电平的时候,SCL从高电平跳变到低电平

  void IIC_Ack(void)

  {

  IIC_SCL=0;

  SDA_OUT();

  IIC_SDA=1;

  delay_us(2);

  IIC_SCL=1;

  delay_us(2);

  IIC_SCL=0;

  }

  (5)通过IIC向从机发送一个字节

  void IIC_Send_Byte(u8 txd)

  {

  u8 t;

  SDA_OUT();

  IIC_SCL=0; //

  for(t=0;t《8;t++)

  {

  IIC_SDA=(txd&0x80)》》7; //依次取出最高位然后送出

  txd《《=1;

  delay_us(2);

  IIC_SCL=1;

  delay_us(2);

  IIC_SCL=0;

  delay_us(2);

  }

  }

  (5)通过IIC向从机读取一个字节

  u8 IIC_Read_Byte(unsigned char ack)

  {

  unsigned char i,receive=0;

  SDA_IN();

  for(i=0;i《8;i++ )

  {

  IIC_SCL=0;

  delay_us(2);

  IIC_SCL=1;

  receive《《=1;

  if(READ_SDA)receive++;

  delay_us(1);

  }

  if (!ack)

  IIC_NAck()

  else

  IIC_Ack();

  return receive;

  }

  IIC器件地址的确定

  1.这个跟主机、从机有关,IIC总线上第一个器件都有一个唯一的地址,如果有两个器件地址相同,将不能正常工作。

  2.大部分器件的IIC地址的某些位甚至全部7位都是固定的。如AT24CXX的高4位都是1010,低4位根据容量大小而变。有的器件初始地址是固定的或可根据引脚高低电平完全确定7位地址,但内部有寄存器可以修改其IIC从机地址,如ITG3200的地址为0b1101000X,X根据芯片的PIN9的高、低电平确定为1或0,并且其内部有寄存器可保存修改后的从机地址。

  3.主机在与从机通信时,都要发送一个从机地址+读/写信号 的字节到总线上,与这个地址匹配的器件会响应后续命令,其他的则不响应。

  STM32硬件IIC和模拟llc有什么区别解析

  1. 硬件IIC用法比较复杂,模拟IIC的流程更清楚一些。

  2. 硬件IIC速度比模拟快,并且可以用DMA

  3. 模拟IIC可以在任何管脚上,而硬件只能在固定管脚上。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分