STM32 HAL库I2C读写操作笔记

电子说

1.2w人已加入

描述

I2C写数据:

I2C写数据时用 HAL_I2C_Master_Transmit 函数,函数参数信息如下:

HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

**DevAddress: **7bit从机地址左移 + 1bit 0

pData: 要发送的数据,数据存储规则是大端方式,即数据发送先发pData[0],再发pData[1],再发pData[2],以此类推。如下代码,addr=0x01, data=0x0220,进行数据打包到trans_data数组发送后,抓取波形如下。

trans_data[0] = addr;
trans_data[1] = data > > 8;
trans_data[2] = data & 0x00FF;


HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)(TMP117_ADDR), trans_data, 3,0xFF);

寄存器

I2C读数据:

I2C写数据时用 HAL_I2C_Master_Receive 函数,函数参数信息如下:

HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)

DevAddress: 7bit从机地址左移 + 1bit 1

pData: 存储读到的数据,数据仍然是大端模式,即第一个接收的数据存在pData[0],第二个存在pData[1],第三个存在pData[2],以此类推,如下代码为处理抓取接收到的数据,最终rt_data的值为 0x0E58。

HAL_I2C_Master_Transmit(&hi2c1, (uint16_t)(TMP117_ADDR), &addr, 1,0xFF);
HAL_I2C_Master_Receive(&hi2c1, (uint16_t)(TMP117_ADDR | 0x01), read_data, 2,0xFF);


rt_data = (read_data[0] < < 8) | read_data[1];


printf("rt_data is: 0x%04xrn", rt_data);

寄存器

打印的结果:

寄存器

这里需要注意下:

ST的HAL库,I2C读函数 HAL_I2C_Master_Receive 仅做读那一部分操作,按照I2C协议,要完成从机的数据读取,需要先寻址发送寄存器地址,然后再读,所以这里需要使用I2C写函数HAL_I2C_Master_Transmit来配合。

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

全部0条评论

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

×
20
完善资料,
赚取积分