This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C123GH6PM:使用 I2C 从温度传感器 TMP117读取

Guru**** 1993015 points
Other Parts Discussed in Thread: TMP117
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1069803/tm4c123gh6pm-read-from-temperatur-sensor-tmp117-using-i2c

部件号:TM4C123GH6PM
“线程”中讨论的其它部件:TMP117

你(们)好
我想在我的微控制器上阅读 TI 温度传感器 TMP117的寄存器。 下图显示了所需的行为:

这是我的 init()函数。 当我看到 I2C 线路上的一些行为时,我猜它是有效的。

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void I2C_init(void)
{
// Enable the I2C0 peripheral
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C1);
I2CMasterEnable(I2C1_BASE);
SysCtlPeripheralReset(SYSCTL_PERIPH_I2C1);
SysCtlPeripheralReset(SYSCTL_PERIPH_I2C1);
// Wait for the I2C0 module to be ready.
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_I2C1))
{
}
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
// Configure the GPIO Pin Mux for PA6 for I2C1SCL
MAP_GPIOPinConfigure(GPIO_PA6_I2C1SCL);
MAP_GPIOPinTypeI2CSCL(GPIO_PORTA_BASE, GPIO_PIN_6);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

我希望使用以下代码:

  1. 发送从属地址
  2. 发送寄存器指针
  3. 读取两个字节

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
uint32_t I2C_readThisRegister()
{
uint8_t slaveAddress = 0b10010010;
uint32_t registerToRead = 0x00001111;
//------WRITE-Section----------------------------------------
I2CMasterSlaveAddrSet(I2C1_BASE, slaveAddress, false);
I2CMasterDataPut(I2C1_BASE, registerToRead);
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START);
while(I2CMasterBusBusy(I2C1_BASE))
{
}
//------READ-Section----------------------------------------
I2CMasterSlaveAddrSet(I2C1_BASE, slaveAddress, true); // set slave address
//read first Byte
I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
while(I2CMasterBusBusy(I2C1_BASE))
{
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

示波器显示仅执行写入零件。 时钟在读取部分不工作。 看起来读取部分被忽略。
我已经尝试过不同的变量,但我无法读取这些值。
PS:示例中的地址不是特别有用。 一旦 I2C 接口工作正常,我会添加代码,以便它能正确驱动传感器。

感谢你的帮助! 非常感谢!

此致

爱国者

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    [引用 userid="291946" url="~ë/support/icros/arm-based 微处理器-组/基于 ARM 的微控制器/f/arm-based 微控制器- forum/1069803/tm4c123ghrpm -读-自回温度传感器-tmp117-use-i2c"]阅读部件中的时钟不工作。 看起来已读部件被忽略。

     您能否显示整个操作的范围上限? 您的意思是时钟不工作?  

     请参阅以下可能有帮助的示例。  

    C:\ti\TiaWare_C_Series-2.2.0.295\examples\boards\EK-tm4c123gxl-bootstxl-sushub\湿度_shtml_simple

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的查尔斯

    感谢您的推荐。 我必须复制了错误的命令。它们看起来类似。 除此之外,i2c 地址的长度为8位,而不是7位。 如果其他人有类似问题,我将在下面发布工作代码。

    init()

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    uint32_t I2C_init(void)
    {
    // Enable the I2C0 peripheral
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C1);
    I2CMasterEnable(I2C1_BASE);
    SysCtlPeripheralReset(SYSCTL_PERIPH_I2C1);
    SysCtlPeripheralReset(SYSCTL_PERIPH_I2C1);
    // Wait for the I2C0 module to be ready.
    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_I2C1))
    {
    }
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    // Configure the GPIO Pin Mux for PA6 for I2C1SCL
    MAP_GPIOPinConfigure(GPIO_PA6_I2C1SCL);
    MAP_GPIOPinTypeI2CSCL(GPIO_PORTA_BASE, GPIO_PIN_6);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    向寄存器写入16位的函数:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    uint32_t I2C_write16BitRegister(uint8_t slaveAddress, uint32_t addressPointer, uint8_t firstByte, uint8_t secondByte)
    {
    I2CMasterSlaveAddrSet(I2C1_BASE, slaveAddress, false);
    I2CMasterDataPut(I2C1_BASE, addressPointer); // pointer auf Unlock register
    I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START);
    while(I2CMasterBusy(I2C1_BASE))
    {
    }
    I2CMasterDataPut(I2C1_BASE, firstByte); // Bit 15 setzen
    I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
    while(I2CMasterBusy(I2C1_BASE))
    {
    }
    I2CMasterDataPut(I2C1_BASE, secondByte);
    I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
    while(I2CMasterBusy(I2C1_BASE))
    {
    }
    return 0;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    函数写入地址指针,然后读取两个字节:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    uint32_t I2C_read16BitRegister(uint8_t slaveAddress, uint8_t registerAddress)
    {
    /*
    * Einzelne Schreibaktion spricht den Sensor an und
    * stellt den Address-Pointer des Sensors auf jenes Register,
    * welches im zweiten Teil gelesen werden soll.
    */
    I2CMasterSlaveAddrSet(I2C1_BASE, slaveAddress, false); // set slave address
    I2CMasterDataPut(I2C1_BASE, registerAddress); // set register to be read
    I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_SINGLE_SEND);
    while(I2CMasterBusy(I2C1_BASE))
    {
    }
    /*---------------------------------READ-Section----------------------------------------
    * Hier zwei Bytes im Burstmode auslesen und zusammensetzen
    */
    I2CMasterSlaveAddrSet(I2C1_BASE, slaveAddress, true); // set slave address
    //read first Byte
    I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    感谢你的帮助。

    此致