RT1052的LPI2C配置
生活随笔
收集整理的這篇文章主要介紹了
RT1052的LPI2C配置
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
開發平臺
- Board:野火RT1052-MINI
- IDE:Keil 5.28
再來說說I2C
I2C是由 Phiilps提出的,目前被廣泛應用在系統內多個IC間的通訊。I2C是一個能夠支持多個設備的總線,包含一條雙向串行數據線SDA,一條串行時鐘線SCL。每個連接到總線的設備都有一個獨立的地址,主機可以通過該地址來訪問不同設備。主機通過SDA線發送設備地址(SLAVE_ADDRESS)查找從機,SLAVE_ADDRESS可以是7位或10位,緊跟著SLAVE_ADDRESS的一個數據位用來表示數據傳輸方向,即第8位或11位。為0時表示寫數據,為1時表示讀數據。
相關時序:
什么是LPI2C
em…LPI2C是啥呢?I2C倒是經常聽經常用,那LPI2C又是什么鬼?翻譯一下就是LPI2C(Low Power I2C),直譯就是低功耗I2C。所以,其實它是能兼容標準I2C協議的。RT1052 的 I2C 外設可用作通訊的主機及從機,支持標準模式 100Kbit/s、快速模式
400Kbit/s、高速模式 3.4Mbit/s 以及超高速模式 5Mbit/s 的傳輸速率,支持 7 位、10 位設備地址,支持 DMA 數據傳輸,并具有數據校驗功能。
LPI2C的初始化代碼
void I2C_Init(void) {lpi2c_master_config_t masterConfig;/* * @時鐘配置* LPI2C1的時鐘來源于,選擇0:來自PLL3,選擇1:來自osc_clk* 由于這里選擇0---來自PLL3(480MHz),所以分頻系數選擇5,即(6-1)*/ CLOCK_SetMux(kCLOCK_Lpi2cMux, 0); CLOCK_SetDiv(kCLOCK_Lpi2cDiv,(6-1));/* IO復用配置 */IOMUXC_SetPinMux(I2C_SCL_MUX,1U);IOMUXC_SetPinMux(I2C_SDA_MUX,1U);/* IO PAD配置 */IOMUXC_SetPinConfig(I2C_SCL_MUX,I2C_PAD_CONFIG_DATA);IOMUXC_SetPinConfig(I2C_SDA_MUX,I2C_PAD_CONFIG_DATA);/* 獲取默認配置 */LPI2C_MasterGetDefaultConfig(&masterConfig);/* 配置LPI2C速度400k */masterConfig.baudRate_Hz = 400000; LPI2C_MasterInit(I2Cx, &masterConfig, I2C_CLOCK); }I2C通訊接口
bool I2C_WriteByte(uint8_t SalveAddr,uint8_t RegAddr,uint8_t *DateByte) {lpi2c_master_transfer_t transfer;status_t err_flag;/** @data :要發送的數據* @datasize :發送的數據個數* @direction :讀寫模式選擇* @flags :傳輸失敗的標志位* @slaveAaddress:從機地址* @subaddress :寄存器/內存地址* @subaddressSize:地址寄存器大小*/transfer.data = DateByte;transfer.dataSize = 1; transfer.direction = kLPI2C_Write;transfer.flags = kLPI2C_TransferDefaultFlag;transfer.slaveAddress =(SalveAddr>>1);transfer.subaddress = RegAddr;transfer.subaddressSize = 0x01;err_flag = LPI2C_MasterTransferBlocking(LPI2C1,&transfer);if(err_flag != kStatus_Success) return false;return true; } bool I2C_ReadByte(uint8_t SalveAddr,uint8_t RegAddr,uint8_t *DateByte) {lpi2c_master_transfer_t transfer;status_t err_flag;/** @data :發送、接受的數據* @datasize :發送的數據個數* @direction :讀寫模式選擇* @flags :傳輸失敗的標志位* @slaveAaddress:從機地址* @subaddress :寄存器/內存地址* @subaddressSize:地址寄存器大小*/transfer.data = DateByte;transfer.dataSize = 1; transfer.direction = kLPI2C_Read;transfer.flags = kLPI2C_TransferDefaultFlag;transfer.slaveAddress =(SalveAddr>>1);transfer.subaddress = RegAddr;transfer.subaddressSize = 0x01;err_flag = LPI2C_MasterTransferBlocking(LPI2C1,&transfer);if(err_flag != kStatus_Success) return false;return true; } bool I2C_WriteBuffer(uint8_t SalveAddr,uint8_t RegAddr,uint8_t *DateByte,uint32_t DataNum) {lpi2c_master_transfer_t transfer;status_t err_flag;/** @data :要發送的數據* @datasize :發送的數據個數* @direction :讀寫模式選擇* @flags :傳輸失敗的標志位* @slaveAaddress:從機地址* @subaddress :寄存器/內存地址* @subaddressSize:地址寄存器大小*/transfer.data = DateByte;transfer.dataSize = DataNum; transfer.direction = kLPI2C_Write;transfer.flags = kLPI2C_TransferDefaultFlag;transfer.slaveAddress =(SalveAddr>>1);transfer.subaddress = RegAddr;transfer.subaddressSize = 0x01;err_flag = LPI2C_MasterTransferBlocking(LPI2C1,&transfer);if(err_flag != kStatus_Success) return false;return true; } bool I2C_ReadBuffer(uint8_t SalveAddr,uint8_t RegAddr,uint8_t *DateByte,uint32_t DataNum) {lpi2c_master_transfer_t transfer;status_t err_flag;/** @data :發送、接受的數據* @datasize :發送的數據個數* @direction :讀寫模式選擇* @flags :傳輸失敗的標志位* @slaveAaddress:從機地址* @subaddress :寄存器/內存地址* @subaddressSize:地址寄存器大小*/transfer.data = DateByte;transfer.dataSize = DataNum; transfer.direction = kLPI2C_Read;transfer.flags = kLPI2C_TransferDefaultFlag;transfer.slaveAddress =(SalveAddr>>1);transfer.subaddress = RegAddr;transfer.subaddressSize = 0x01;err_flag = LPI2C_MasterTransferBlocking(LPI2C1,&transfer);if(err_flag != kStatus_Success) return false;return true; }總結
以上是生活随笔為你收集整理的RT1052的LPI2C配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css图片精灵定位_CSS精灵图片(CS
- 下一篇: 常见专业术语名词解释(持续更新)