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來配合。
-
寄存器
+關注
關注
31文章
5359瀏覽量
120814 -
STM32
+關注
關注
2270文章
10915瀏覽量
356778 -
數據存儲
+關注
關注
5文章
977瀏覽量
50976 -
I2C總線
+關注
關注
8文章
391瀏覽量
61064 -
HAL庫
+關注
關注
1文章
121瀏覽量
6339
發布評論請先 登錄
相關推薦
評論