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来配合。