主题中讨论的其他器件:TMDS570LS31HDK、 HALCOGEN、 LP8866EVM、
我使用的是 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。 数据需要连续时。 为什么 我不 在无限循环中连续获取?