你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32硬件IIC操作

[复制链接]
STMCU小助手 发布时间:2022-1-25 21:49
Stm32具有IIC接口,接口有以下主要特性
多主机功能:该模块既可做主设备也可做从设备
主设备功能
C地址检测
产生和检测7位/10位地址和广播呼叫
支持不同的通讯速度
状态标志:
发送器/接收器模式标志
字节发送结束标志
总线忙标志
错误标志
2个中断向量
可选的拉长时钟功能
具单字节缓冲器的DMA
虽然很多人说STM的硬件IIC不好用,但是对于这么一个设备去探索一下还是很有必要的,指不定哪天就用上了呢,
IIC借口一共有九个寄存器,比较重要的几个寄存器分别如下

1.       CR1
20141006204029435.jpg
20141006204020386.jpg
20141006204024739.jpg



由这几个位我们可以正常产生标准IIC的START条件STOP条件,ACK与NOACK

CR2


控制IIC的通行频率
这两位检测IIC总线是否收到数据



20141006203908453.jpg

1.       对于硬件IIC的初始化流程包括
1.       配置IO口,配置为GPIO_Mode_AF_OD模式
2.       选择IIC模式
3.       选择是否使能自动应答以及设备地址长度
4.       设置IIC总线的传输速率
2.       硬件IIC的读写操作其实逻辑上和标准总线类似,也是发送地址等待ack发送数据等待ACK,但是因为有硬件的自动参与,所以我们不需要延时了

具体代码如下
  1. void HmcIICInit(void)
  2. {
  3.         /*GPIO初始化*/
  4.         GPIO_InitTypeDef GPIO_InitStructure;
  5.         /* 配置硬件IIC需要的变量 */
  6.         I2C_InitTypeDef I2C_InitStructure;

  7.         /* 使能与 I2C1 有关的时钟 */
  8.         RCC_APB2PeriphClockCmd  (RCC_APB2Periph_GPIOB,ENABLE );
  9.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);  

  10.         /* PB6-I2C1_SCL、PB7-I2C1_SDA*/
  11.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  14.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  15.         /*IIC外设初始化*/

  16.         /* I2C 配置 */
  17.         I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ;     //配置为普通IIC模式
  18.         //I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  19.         //I2C_InitStructure.I2C_OwnAddress1 = SlaveAddress;
  20.         I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;  //使能自动应答   
  21.         I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  22.         I2C_InitStructure.I2C_ClockSpeed = 50000;   //5K的速度?


  23.         /* I2C1 初始化 */
  24.         I2C_Init(I2C1, &I2C_InitStructure);          

  25.         /* 使能 I2C1 */
  26.         I2C_Cmd  (I2C1,ENABLE);
  27.         /*允许应答模式*/
  28.         I2C_AcknowledgeConfig(I2C1, ENABLE);   
  29. }

  30. void HmcByteWrite(u8 addr,u8 dataValue)
  31. {
  32.         I2C_GenerateSTART(I2C1,ENABLE);

  33.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

  34.         I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Transmitter);

  35.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

  36.         I2C_SendData(I2C1,addr);

  37.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  38.         I2C_SendData(I2C1,dataValue);

  39.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  40.         I2C_GenerateSTOP(I2C1,ENABLE);

  41. }

  42. u8 HmcByteRead(u8 addr)
  43. {
  44.         u8 dataValue;

  45.         while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));

  46.         I2C_GenerateSTART(I2C1,ENABLE);//起始信号

  47.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

  48.         I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Transmitter);//发送设备地址+写信号

  49.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//

  50.         I2C_Cmd(I2C1,ENABLE);

  51.         I2C_SendData(I2C1,addr);//发送存储单元地址,从0开始

  52.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));

  53.         I2C_GenerateSTART(I2C1,ENABLE);//起始信号

  54.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

  55.         I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Receiver);//发送设备地址+读信号

  56.         while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

  57.         I2C_AcknowledgeConfig(I2C1,DISABLE);

  58.         I2C_GenerateSTOP(I2C1,ENABLE);

  59.         while(!(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)));

  60.         dataValue=I2C_ReceiveData(I2C1);//读出寄存器数据

  61.         return dataValue;
  62. }

复制代码


收藏 1 评论1 发布时间:2022-1-25 21:49

举报

1个回答
小猪000 回答时间:2022-1-31 22:57:51

66666

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版