使用TM4C123GH6PM 的I2C读取TMP75温度寄存器的值,使用一个例程读取到的值是对的,但是它的函数操作顺序与123gh6pm的数据手册不同,我自己参照123gh6pm数据手册写了一个读寄存器函数,但发现读出来的值是乱的, 下面第一个函数是例程,第二个函数是我自己写的. 希望大家能帮忙看一下哪里出了问题,ps(其它配置计算等皆无问题,)
/********************************************
* 例程里的读寄存器函数,能正确读取温度值
* TMP_READ_DELAY是600
* *****************************************/
uint16_t
TMP75DataRead(void)
{
uint8_t i2cWriteBuffer;
uint32_t i2cReadBuffer[2];
uint16_t temp_value;
uint16_t i2c_read_delay;
i2cWriteBuffer = TMP_TEMP_REG;
i2cWriteBuffer &= 0x03;
// frame 1:
I2CMasterSlaveAddrSet(I2C1_BASE, TMP_I2C_ADDR, false);
// frame 2:
I2CMasterDataPut(I2C1_BASE, i2cWriteBuffer);
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_SINGLE_SEND);
i2c_read_delay = TMP_READ_DELAY;
while (i2c_read_delay--);
// frame 3:
I2CMasterSlaveAddrSet(I2C1_BASE, TMP_I2C_ADDR, true);
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
// frame 4:
i2cReadBuffer[0] = I2CMasterDataGet(I2C1_BASE);
i2c_read_delay = TMP_READ_DELAY;
while (i2c_read_delay--)
;
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
// frame 5:
i2cReadBuffer[1] = I2CMasterDataGet(I2C1_BASE);
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
temp_value = (i2cReadBuffer[0] << 8) | i2cReadBuffer[1];
return temp_value;
}
/*
* 这是我自己写的读寄存器函数 ,读出的值不对
* 入口参数: ui32I2CBase -- i2c基址, ui8SlaveAddr -- 从机地址,
* ui8RegAddr -- 寄存器地址
* 返 回 值: ui16RegData -- 读到的寄存器值
*/
uint16_t I2CReadRegTwoByte(uint32_t ui32I2CBase, uint8_t ui8SlaAddr,
uint8_t ui8RegAddr)
{
uint8_t ui8WriteBuffer = 0; /* 写缓冲器 */
uint32_t ui32ReadBuffer = 0; /* 读缓冲器 */
uint16_t ui16RegData = 0;
// 查询BUSY位
while(I2CMasterBusy(ui32I2CBase))
{
;
}
// frame 1: 向从机地址I2CMSA寄存器写从机地址
ui8WriteBuffer = ui8SlaAddr;
I2CMasterSlaveAddrSet(ui32I2CBase, ui8WriteBuffer, false);
// frame 2: 向数据寄存器I2CMDR写数据
ui8WriteBuffer = ui8RegAddr;
I2CMasterDataPut(ui32I2CBase, ui8WriteBuffer);
// // 查询BUSBUSY位 (多主机模式) (单主机模式下或被忽略)
// while(I2CMasterBusBusy(ui32I2CBase))
// ;
// frame 3: 向控制/状态寄存器I2CMCS 写 "---0-011" 产生start 不产生stop
I2CMasterControl(ui32I2CBase, I2C_MASTER_CMD_BURST_SEND_START);
// 查询BUSY位
while(I2CMasterBusy(ui32I2CBase))
;
// 查询ERROR位
while(I2CMasterErr(ui32I2CBase) != I2C_MASTER_ERR_NONE)
{
// 若有错误 死在这里或进入中断处理程序
;
}
/******************传输后以重复开始序列进行的接收***************/
// frame 4: 向从机地址I2CMSA寄存器写从机地址
I2CMasterSlaveAddrSet(ui32I2CBase, ui8SlaAddr, true);
// // 查询BUSBUSY位 (多主机模式) (单主机模式下或被忽略)
// while(I2CMasterBusBusy(ui32I2CBase))
// ;
// frame 5: 向控制/状态寄存器I2CMCS 写 "---01011" 产生重复开始
I2CMasterControl(ui32I2CBase, I2C_MASTER_CMD_BURST_RECEIVE_START);
// 查询BUSY位
while(I2CMasterBusy(ui32I2CBase))
;
// 查询ERROR位
while(I2CMasterErr(ui32I2CBase) != I2C_MASTER_ERR_NONE)
{
// 若有错误 死在这里或进入中断处理程序
;
}
// frame 6: 从主机数据寄存器I2CMDR读第一个数据, 默认高8bit(MSB)
ui32ReadBuffer = I2CMasterDataGet(ui32I2CBase);
ui16RegData = ui32ReadBuffer << 8;
// frame 7: 向控制/状态寄存器I2CMCS 写 "---00101" 产生stop
I2CMasterControl(ui32I2CBase, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
// 查询BUSY位
while(I2CMasterBusy(ui32I2CBase))
;
// 查询ERROR位
while(I2CMasterErr(ui32I2CBase) != I2C_MASTER_ERR_NONE)
{
// 若有错误 死在这里或进入中断处理程序
;
}
// frame 8: 从主机数据寄存器I2CMDR读第二个数据, 默认低8bit(LSB)
ui32ReadBuffer = I2CMasterDataGet(ui32I2CBase);
ui16RegData |= ui32ReadBuffer;
return ui16RegData;
}
这是芯片读时序图