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**** 2524550 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 线路上的一些行为时,我猜它是有效的。

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);


     // Configure the GPIO Pin Mux for PA7 for I2C1SDA
     MAP_GPIOPinConfigure(GPIO_PA7_I2C1SDA);
     MAP_GPIOPinTypeI2C(GPIO_PORTA_BASE, GPIO_PIN_7);

    // Initialize Master and Slave
    I2CMasterInitExpClk(I2C1_BASE, SysCtlClockGet(), false);

    while(I2CMasterBusBusy(I2C1_BASE))
    {
    }
}

我希望使用以下代码:

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

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))
     {
     }
    uint32_t msb=I2CMasterDataGet(I2C1_BASE);

    //read second Byte
    I2CMasterControl( I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
    while(I2CMasterBusBusy(I2C1_BASE))
      {
      }
    uint32_t lsb=I2CMasterDataGet(I2C1_BASE);

    return ((msb << 8)| lsb);
}

示波器显示仅执行写入零件。 时钟在读取部分不工作。 看起来读取部分被忽略。
我已经尝试过不同的变量,但我无法读取这些值。
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()

    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);
    
    
        // Configure the GPIO Pin Mux for PA7 for I2C1SDA
        MAP_GPIOPinConfigure(GPIO_PA7_I2C1SDA);
        MAP_GPIOPinTypeI2C(GPIO_PORTA_BASE, GPIO_PIN_7);
    
        // Initialize Master and Slave
        I2CMasterInitExpClk(I2C1_BASE, SysCtlClockGet(), false);
    
        while(I2CMasterBusBusy(I2C1_BASE))
        {
        }
        return 0;
    }

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

    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;
    }

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

    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);
        while(I2CMasterBusy(I2C1_BASE))
        {
        }
        uint32_t msb=I2CMasterDataGet(I2C1_BASE);
    
        //read second Byte
        I2CMasterControl(I2C1_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
        while(I2CMasterBusy(I2C1_BASE))
        {
        }
        uint32_t lsb=I2CMasterDataGet(I2C1_BASE);
    
        return ((msb << 8) | lsb);
    }

    感谢你的帮助。

    此致