硬件IIC怎么配置呢?

以下文章来源于:公_众_号开源电子网
读取更多技术文章,请扫码关注
在这里插入图片描述

关注公众号,后台回复:硬件IIC

(免费领取项目文件)

硬件IIC怎么配置呢?

IIC,英文全称:Inter Integrated Circuit,集成电路总线,是飞利浦公司在八十年代开发的一种串行、同步、半双工总线。

IIC总线协议无非就是几样东西:起始信号、停止信号、应答信号、以及数据有效性。大家学习了正点原子的IIC实验,应该很了解IIC时序。正点原子使用的是软件模拟IIC,也就是用IO口模拟出IIC时序去通信。而使用硬件IIC,就可以不用管时序信号,配置好之后就可以产生时序。虽说ST的硬件IIC很鸡肋,但是某些方面还是比软件模拟IIC稍微强一点。
下面列出一个硬件IIC和软件IIC的对比表。
在这里插入图片描述

软件IIC整个流程很清晰,假如出了bug,你能很快找到问题,硬件IIC就需要动用DS100示波器去看波形,波形的查看教程可以参考以下推文《嵌入式工程师必备技能—如何使用示波器查看IIC波形》https://mp.weixin.qq.com/s/lnSORSbXeNJe-QVwW0EVbg。
其实很多时候是在管脚上考量使用软件IIC。硬件IIC虽然被听说吐槽过千百遍,但是有些人还是有兴趣想使用STM32的IIC外设的,那么本文就教一下大家使用硬件IIC,侧重于使用(这里使用的是F1 HAL库)。
首先,先看HAL库给IIC定义好的结构体,这里主要讲解IIC初始化结构体:

typedef struct
{
  uint32_t ClockSpeed;			/* 设置SCL时钟频率,该值要低于400k */
  uint32_t DutyCycle;        	/* 时钟占空比即low/high = 2:1 或 16:9 */
  uint32_t OwnAddress1;  		/* STM32的IIC设备地址1(支持7bit或10bit) */
  uint32_t AddressingMode;		/* 地址模式(7位 / 10位) */
  uint32_t DualAddressMode;		/* 是否使用STM32的IIC设备地址2 */
  uint32_t OwnAddress2;			/* STM32的IIC设备地址2(支持7bit) */
  uint32_t GeneralCallMode;  	/* IIC从模式时广播模式设置 */
  uint32_t NoStretchMode;    	/* IIC禁止时钟延长模式设置(从模式使用,主模式关闭) */
} I2C_InitTypeDef;

第一个成员ClockSpeed就是IIC的传输速率,主要看从机,从机AT24C02是最大为400kHz,低于400kHz即可。
第二个成员DutyCycle就是SCL线时钟占空比,就是低电平与高电平的比值,没有严格限制,选择2:1或者16:9即可。
第三个成员OwnAddress1就是STM32的IIC设备的自身地址,挂载在IIC总线上的器件每一个都有自己唯一地址,作为主机也不另外。特别注意:这里地址的设置不要跟从机一样即可。
第四个成员AddressingMode就是地址的位数是使用7位还是10位,这要看从机了。对于AT24C02来说,直接使用7位。
第五个成员DualAddressMode是用来配置是否支持双设备地址,没有用到可以不配置。
第六个成员OwnAddress2就是STM32的IIC设备的自身地址,是否有效取决于DualAddressMode成员的设置。
第七个成员GeneralCallMode就是广播呼叫模式,作为从机时使用,通常用上不。
第八个成员NoStrethMode就是时钟线延长,也是作为从机时使用的,通常用不上。
在IIC实验例程中,编写hwiic_init如下:

I2C_HandleTypeDef g_iic_handler;

void hwiic_init(void)
{
    g_iic_handler.Instance = I2C1;
    
    g_iic_handler.Init.AddressingMode	= I2C_ADDRESSINGMODE_7BIT;  
    g_iic_handler.Init.ClockSpeed       	= 300000;                 
    g_iic_handler.Init.DualAddressMode	= I2C_DUALADDRESS_DISABLE;  
    g_iic_handler.Init.DutyCycle       	= I2C_DUTYCYCLE_2;         
    g_iic_handler.Init.GeneralCallMode	= I2C_GENERALCALL_DISABLE;  
    g_iic_handler.Init.NoStretchMode  	= I2C_NOSTRETCH_DISABLE;   
    g_iic_handler.Init.OwnAddress1    	= 0x0A;                    
    g_iic_handler.Init.OwnAddress2    	= 0;                       
    
    HAL_I2C_Init(&g_iic_handler);
}
这里是调用HAL_I2C_Init函数对IIC进行初始化,在IIC的初始化回调函数中就要使能I2C1时钟以及对相关引脚进行初始化,特别注意GPIO口的模式(复用开漏输出),这部分代码比较简单就不列出来了。
初始化完成后,就可以使用HAL库提供的IIC发送和接收函数,函数如下:

第一个参数hi2c就是IIC的句柄结构体地址。
第二个参数DevAddress就是从机的设备地址,注意这里并不是通讯地址。
第三个参数MemAddress就是要写入的地址。
第四个参数MemAddSize就是地址的长度。
第五个参数pData就是要写入的数据的地址。
第六个参数Size就是写入数据的个数
第七个参数Timeout就是函数执行的超时时间。
以往的AT24C02的写操作函数和读操作函数,函数体内一堆代码,现在只是几行代码。

at24c02写一字节函数代码如下:

void at24c02_write_one_byte(uint8_t addr, uint8_t data)
{
    HAL_I2C_Mem_Write(&g_iic_handler, 0xA0, (uint16_t)addr, I2C_MEMADD_SIZE_8BIT, (uint8_t *)&data, 1, 100) != HAL_OK)
    
while(HAL_I2C_GetState(&g_iic_handler) != HAL_I2C_STATE_READY);
}
at24c02读一字节函数代码如下:
uint8_t at24c02_read_one_byte(uint8_t addr)
{
    uint8_t data;
    
    HAL_I2C_Mem_Read(&g_iic_handler, 0xA0, (uint16_t)addr, I2C_MEMADD_SIZE_8BIT, (uint8_t *)&data, 1, 100);

return data;
}

假如说直接用HAL_I2C_Mem_Write来编写连续写函数,就有页写限制,也就是最多8字节,当你写入的数据大于8字节时,就会出现错误了。所以编写at24c02的连续写函数最好就是调用at24c02_write_one_byte这个函数接口。
最终可以比对一下相同数据量的传输下,软件模拟IIC和硬件IIC的速度对比。
硬件IIC的配置使用还是挺简单的,速度上面还是比模拟IIC快,假如说是驱动OLED屏幕的话,可以试用一下硬件IIC提高一下刷新率,得到更好的显示效果。

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值