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.

[参考译文] CCS/TMS570LS1227:通过 I2C 读取 TMP468温度传感器

Guru**** 2481465 points
Other Parts Discussed in Thread: HALCOGEN, TMP468

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/702154/ccs-tms570ls1227-reading-tmp468-temperature-sensor-via-i2c

器件型号:TMS570LS1227
主题中讨论的其他器件:HALCOGENTMP468

工具/软件:Code Composer Studio

您好!

我对 i2c 非常陌生、对使用主器件从从器件读取内容有了一定的了解、但我正在努力成功地对伪代码进行编码。

我想使用 TMS50ls1227PGE 的 i2c 总线读取 TI TMP468上的本地温度传感器。 我已经启用了 i2c 驱动器、pinmux、并在 HalCoGen 中启用了所有 i2c 中断。  

在 CCS 中、我在 FreeRTOS 任务中键入了以下代码(我在 main 中键入了 i2cInit()):  

/*将方向设置为接收器*/
i2cSetDirection (i2cREG1、I2C_transmitter);
i2cSetMode (i2cREG1、I2C_MASTER);
i2cSetSlaveAdd (i2cREG1、0b1001000);

i2cSetStart (i2cREG1);//开始位
i2cSendByte (i2cREG1、0b10010000);//写入地址1001000、温度传感器的地址
i2cSendByte (i2cREG1、0b00000000);//内部温度传感器位于寄存器0

i2cSetStart (i2cREG1);//重新发送开始位
i2cSendByte (i2cREG1、0b10001);//从器件1001000读取

while (i2cIsRxReady (i2cREG1)){};//等待清零
i2cSetDirection (i2cREG1、I2C_receiver);//设置 i2c 以接收数据

数据= i2cReceiveByte (i2cREG1);//从寄存器接收字节

i2cSetStop (i2cREG1);//发送停止位 

我在我的数据变量中看不到任何活动、当我调试时、代码始终停留在 i2cSendByte 的内部"while ((i2c->STR &(uint32) I2C_TX_INT)=0U"

我不确定从哪里来、有什么想法或明显的错误?

谢谢!

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

    您是否配置了 I/O 多路复用以允许 I2C 信号在分配的终端上输出? I2C 不是分配的端子上的默认功能、需要配置 I/O 多路复用模块(IOMM)来选择要输出的 I2C 信号。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sunil、

    是的、我已经使用 halcogen 启用了 i2c 引脚多路复用器。 至于 i2c 中断、我不确定需要启用哪些中断。 是否有相关文档?

    我还更新了我的代码、其中 Slave_Address = 0b100100、Slave_Word_Address = 0x0、DATA_COUNT = 1、Receive_data_setup = 0x1。

    请参阅下面的内容

    /*等待 MST 位被清零,这将进行
    *清除总线忙后的几个周期*/
    //while (i2cIsMasterReady (i2cREG1)!= true);
    
    /*配置要与*/通话的从机地址
    i2cSetSlaveAdd (i2cREG1、Slave_Address);
    
    /*将方向设置为发送器*/
    /*注意:可选-在 Init 中完成*/
    i2cSetDirection (i2cREG1、I2C_transmitter);
    
    /*配置数据计数*/
    /*读取之前从器件地址+字地址写入操作*/
    i2cSetCount (i2cREG1、receive_data_setup);
    
    /*将模式设置为主设备*/
    i2cSetMode (i2cREG1、I2C_MASTER);
    
    /*设置编程计数后停止*/
    i2cSetStop (i2cREG1);
    
    /*发送开始条件*/
    i2cSetStart (i2cREG1);
    
    /*发送字地址*/
    i2cSendByte (i2cREG1、Slave_Word_address);
    
    /*等待总线忙被清除*/
    while (i2cIsBusy (i2cREG1)=true);
    
    /*等待直到检测到停止*/
    while (i2cIsStopDetected (i2cREG1)=0);
    
    /*清除停止条件*/
    i2cClearSCD (i2cREG1);
    
    /********* /
    ////开始从从属方接收数据
    /********* /
    
    /*等待 MST 位被清零,这将进行
    *清除总线忙后的几个周期*/
    while (i2cIsMasterReady (i2cREG1)!= true);
    
    /*配置要与*/通话的从机地址
    i2cSetSlaveAdd (i2cREG1、Slave_Address);
    
    /*将方向设置为接收器*/
    i2cSetDirection (i2cREG1、I2C_RECEIVER);
    
    /*配置数据计数*/
    /*注:可选-在 Init 中完成,除非用户想要更改*/
    i2cSetCount (i2cREG1、data_count);
    
    /*将模式设置为主设备*/
    i2cSetMode (i2cREG1、I2C_MASTER);
    
    /*设置编程计数后停止*/
    i2cSetStop (i2cREG1);
    
    /*发送开始条件*/
    i2cSetStart (i2cREG1);
    
    /*轮询模式下的 Transmit data_count 数据数量*/
    i2cReceive (i2cREG1、DATA_COUNT、RX_Data_Master);
    
    /*等待总线忙被清除*/
    while (i2cIsBusy (i2cREG1)=true);
    
    /*等待直到检测到停止*/
    while (i2cIsStopDetected (i2cREG1)=0);
    
    /*清除停止条件*/
    i2cClearSCD (i2cREG1);
    
    asm (" nop");
    asm (" nop");
    asm (" nop");
    
    while (1); 

    此代码始终在"i2cInterrupt()"内挂起、因此我想我已经把 halcgen 中的 i2c 中断弄乱了。 我目前已选择所有这些选项。 对于我的用例、这是正确的吗?

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

    您好 Ben、

    只需阅读 TMP468数据表、即可通过块读取或单个寄存器读取来访问 TMP468寄存器。 指针值00h 至08h 用于单次寄存器读取。 DATA_COUNT = 1对于指针= 0x00 (Slave_Word_Address)是可以的。

    开始、然后是从器件地址、写入位(发送)。 ACK

    写入数据:指针字节。 ACK

    3.重复 START、从机地址、读取位(接收器)。 ACK

    4.从传感器读取数据字节1。 NAK

    5.停止

    您不会遵循此序列。 第3步和第3步之间没有停止。 您需要启用重复模式。