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.

[参考译文] TMS570LS3137:在无限循环中进行 I2C 发送和接收

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1303587/tms570ls3137-i2c-send-and-receieve-in-infinite-loop

器件型号:TMS570LS3137
主题中讨论的其他器件:TMDS570LS31HDKHALCOGENLP8866EVM

我使用的是 TMDS570LS31HDK 评估板和 CCS v12.5.0、Halcogen v04.07.01。

此外、我将 LP8866EVM 用于我们的项目、因此我想在 I2C 上与 TMS570LS3137进行 LP8866EVM 通信。

我将 halcogen 配置设置如下所示。

我的代码如下。

 

#包含 "sys_common.h"

 

/*用户代码开始(1)*/

#包含 "Gio.h"

#包含 "I2C.h"

#包含 "HET.h"

#包含 tms_I2C.h"

 

hetSIGNAL_t het1;

 

uint8_t TX_DATA[3]={ 0x02、0xFF、0x00 };

uint8_t rx_data[2]={ 0 };

uint16_t DELAY = 0;

Tms_I2C_recv (uint8_t slaveAddr、uint8_t memAddr、uint8_t memAddrLen、uint8_t * recvBuf、uint8_t len)
{
i2cSetSlaveAdd (i2cREG1、slaveAddr);
i2cSetDirection (i2cREG1、I2C_TRANSMIT);
i2cSetCount (i2cREG1、memAddrLen);
i2cSetMode (i2cREG1、I2C_MASTER);
i2cSetStop (i2cREG1);
i2cSetStart (i2cREG1);
i2cSend (i2cREG1、memAddrLen、(uint8_t *)&memAddr);
while (i2cIsBusy (i2cREG1)== true);
while (i2cIsStopDetected (i2cREG1)=0);

i2cSetSlaveAdd (i2cREG1、slaveAddr);
i2cSetDirection (i2cREG1、I2C_receiver);
i2cSetCount (i2cREG1、len);
i2cSetMode (i2cREG1、I2C_MASTER);
i2cSetStop (i2cREG1);
i2cSetStart (i2cREG1);
i2cReceive (i2cREG1、len、recvBuf);
while (i2cIsBusy (i2cREG1)== true);
while (i2cIsStopDetected (i2cREG1)=0);
i2cClearSCD(i2cREG1);
// for (delay=0;delay<3;delay++);

 

内部 ( )

{  

   GioInit ();

   gioSetBit (gioPORTA、0、1);//为  LP8866EVM 启用

   i2cInit ();

 //用于 LP8866EVM 的 PWM 初始化

   异构初始化 ();

  pwmStart (hetRAM1、pwm0);

   HET1.DUTY = 2;

   HET1.PERIOD = 100;

  pwmSetSignal (hetRAM1、pwm0、het1);

 

   同时 (1)

   {

      TMS_I2C_recv (0x2b、0x1A、1、RX_DATA、2); //我们的 I2C 地址为0x2B。

   返回 0

  }

 I2C 配置如下所示;

空 i2cInit (void)
{
/*用户代码开始(3)*/
/*用户代码结束*/

/**@b 初始化@b I2C */

/**- i2c 输入重置*/
i2cREG1->MDR =(UINT32)((UINT32) 0U<< 5U);

/**-设置 i2c 模式*/
i2cREG1->MDR =(UINT32)((UINT32) 0U << 15U)/* NACK MODE */
|(UINT32)((UINT32) 0U<< 14U)/*自由运行*/
|(UINT32)(0U)/*启动条件-仅主机*/
|(UINT32)((UINT32) 1U <<11U)/*停止条件*/
|(UINT32)((UINT32) 0U<<10U)/*主/从模式*/
|(UINT32)((UINT32) I2C_TRANSMIT)/*发送器/接收器*/
|(UINT32)((UINT32) I2C_7BIT_AMODE)/*扩展地址*/
|(UINT32)((UINT32) 0U<< 7U)/*重复模式*/
|(UINT32)((UINT32) 0U<<6U)/*数字环回*/
|(UINT32)((UINT32) 0U << 4U)/*起始字节-仅主机*/
|(UINT32)((UINT32) 0U<< 3U)/*自由数据格式*/
|(uint32)(I2C_8_bit);/*位计数*/


/**-设置 i2c 向后兼容模式*/
i2cREG1->eMDR = 0u;

/**-禁用 DMA */
i2cREG1->DMACR = 0x00U;

/**-设置 i2c 数据计数*/
i2cREG1->CNT = 8u;

/**-禁用所有中断*/
i2cREG1->IMR = 0x00U;

/**-设置预分频*/
i2cREG1->PSC = 0U;

/**-设置时钟速率*/
i2cREG1->CKH = 33u;
i2cREG1->CKL = 33U;

/**-设置 i2c 引脚功能模式*/
i2cREG1->PFNC =(0u);

/**-设置 i2c 管脚默认输出值*/
i2cREG1->DOUT =(UINT32)((UINT32) 0U << 1U)/* sda 引脚*/
|(uint32)(0U);/* SCL 引脚*/

/**-设置 i2c 引脚输出方向*/
i2cREG1->DIR =(UINT32)((UINT32) 0U << 1U)/* sda 引脚*/
|(uint32)(0U);/* SCL 引脚*/

/**-将 i2C 引脚的开漏使能*/
i2cREG1->PDR =(UINT32)((UINT32) 0U << 1U)/* sda 引脚*/
|(uint32)(0U);/* SCL 引脚*/

/**-设置 i2c 引脚上拉/下拉使能*/
i2cREG1->PDIS =(UINT32)((UINT32) 1U << 1U)/* sda 引脚*/
|(uint32)(1U);/* SCL 引脚*/

/**-设置 i2c 引脚上拉/下拉选择*/
i2cREG1->PSEL =(UINT32)((UINT32) 1U << 1U)/* sda 引脚*/
|(uint32)(1U);/* SCL 引脚*/

/**-设置中断使能*/
i2cREG1->IMR =(UINT32)((UINT32) 0U<<6U)/*作为从机中断的地址*/
|(UINT32)((UINT32) 0U<< 5U)/*停止条件检测中断*/
|(UINT32)((UINT32) 0U << 4U)/*发送数据就绪中断*/
|(UINT32)((UINT32) 0U << 3u)/*接收数据就绪中断*/
|(UINT32)((UINT32) 0U << 2U)/*寄存器访问就绪中断*/
|(UINT32)((UINT32) 0U << 1u)/*无确认中断*/
|(UINT32)((UINT32) 0U);/*仲裁中断丢失*/

/**- i2c 退出复位*/
i2cREG1->MDR |=(uint32) I2C_RESET_OUT;

/**-初始化全局传输变量*/
G_i2cTransfer_t.mode =(uint32) 0U<< 4U;
G_i2cTransfer_t.length = 0u;

/*用户代码开始(4)*/
/*用户代码结束*/

我已经与从器件进行了通信。 但是、如果您注意我的代码、我们的接收代码将在无限循环中运行、因此、我需要持续接收。 但正如您在逻辑分析仪下面看到的、我花了几次时间、I2C 正忙总线。



在逻辑分析仪的最后一幅图中、最后一个数据是 NACK。 数据需要连续时。 为什么 我不 在无限循环中连续获取?

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

    尊敬的 

    您确定以下代码吗?

    [报价 userid="579927" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1303587/tms570ls3137-i2c-send-and-receieve-in-infinite-loop "]

    同时 (1)

       {

          TMS_I2C_recv (0x2b、0x1A、1、RX_DATA、2); //我们的 I2C 地址为0x2B。

       返回 0

      }

    [/报价]

    您是否放置了 返回0 在 while (1)中?  

    如果您这样做的话、您的"TMS_I2C_recv"函数将只执行一次、而当 CPU 执行返回指令时、它立即退出 main 函数。

    --
    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    实际上、我没有写入"返回0"。  它由 halcogen 放置、但当我推出它、但代码仍然相同运行

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

    尊敬的 Muhammet:

    在以下常见问题解答中、我们确实有几个经过测试的 i2c 示例、您能否介绍一下并尝试自行解决问题?

    (+)[常见问题解答] TMS570LC4357:适用于 Hercules 控制器的示例和演示(例如 TMS570x、RM57x 和 RM46x 等)-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    --
    谢谢。此致、
    Jagadish。