笔者跟着B站铁头山羊视频学习 STM32-HAL库 开发教程。下面对HAL库有关 I2C 课程知识和应用做一个梳理。
省流:
uint8_t commands[] = {0x00, 0x8d, 0x14, 0xaf, 0xa5};
HAL_I2C_Master_Transmit(&hi2c1,0x78,commands,sizeof(commands)/sizeof(commands[0]) ,HAL_MAX_DELAY);
sizeof(commands)/sizeof(commands[0]) // 结果等于5,表示5个元素
主机发送5个元素数据给从机。
uint8_t Data_Receive;
HAL_I2C_Master_Receive(&hi2c1,0x78,&dataRcvd,1,HAL_MAX_DELAY);
if((dataRcvd & (0x01<<6)) == 0)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
}
读取从机的数据保存到自定义的变量中,再判断第6位是否为0。
1、I2C 总线基本原理
这里的示例模拟了I2C总线主机的写读过程,有弹幕和评论说主机在寻址完之后应该发送从机寄存器地址,这里笔者在学习江科大标准库的时候确实是这样的。可能铁头山羊想把这部分内容放到进阶版视频再详细讲。作为入门的初学者来说,用这4个阶段来理解I2C正合适不过。实际开发与基础理论有出入更能让我们记忆深刻。
2、示例
2.1 简单数据传输
(1)I2C模式参数
(2)程序
uint8_t commands[] = {0x00, 0x8d, 0x14, 0xaf, 0xa5};
sizeof(commands) // uint8_t 规定元素占1个字节,结果等于1*5个元素=4
sizeof(commands[0]) // 一个数据元素占1个字节,结果等于1
sizeof(commands)/sizeof(commands[0]) // 结果等于5