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.

[参考译文] TMS320F28069:与 MCP9808进行 I2C 通信

Guru**** 2599045 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/675515/tms320f28069-i2c-communiciation-with-mcp9808

器件型号:TMS320F28069
主题中讨论的其他器件:C2000WARE

您好!

我正在尝试通过 F28069 MCU 的 I2C 从 MCP9808读取温度数据。 但我不能。 请找到以下代码。 你有什么建议吗?

MCP9808

// I2C GPIO 配置
//为所选引脚启用内部上拉*/
GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0;//为 GPIO32 (SDAA)
GpioCtrlRegs.GPBPUD.bit.GPIO33启用上拉;//为 GPIO32.Gpin 启用上拉;
*仅为 GPIO32.GCLA
设置(GPBPUZ1.bit.GPIO3*) // asynch 输入 GPIO32 (SDAA)
GpioCtrlRegs.GPBQSEL1.bit.GPIO33=3;// asynch 输入 GPIO33 (SCLA)
//使用 GPIO regs*/
GpioBMlRegs.GPUX1.bit.GPIO32=1配置 I2C 引脚;//针对 GPIO32.GPIO33/
GPCLA.GPIO33= 1配置 GPIO33/ GPIO1.GPIO1.bit.GPIO32.GPIO1.GPIO1.bit.GPIO33/ GPIO1.GPIO1.GPIO32.GPIO1.GPIO1.GPIO32.GPIO1.bit.GPIO32.GPIO32.GPIO1.bit.GPIO 
void InitI2C()
{
//初始化 I2C

I2cRegs.I2CMDR.bit.IRS = 0;
I2cRegs.I2CPSC.ALL = 8;//预分频器-需要7-12MHz 的模块 clk
I2cRegs.I2CCLKL=10;//注意:必须为非零
I2CIER=0x24;注意:I2CIELCR.I2I2I2CIEL
= 0;//启用 SCD 和 ARDY 中断

I2CARegs.I2CMDR.ALL = 0x0020;//使 I2C 退出复位
//挂起

I2CARegs.I2CFFTX.ALL = 0x6000时停止 I2C;//
启用 FIFO 模式和 TXFIFO I2CARegs.I2CFFRX.ALL = 0x2040;//清除 RXFIFO


。} 
长 GetTemperature (void)
{
长温度;
长 TempUpperByte;
长 TempLowerByte;

I2caRegs.I2CMDR.bit.IRS = 1; //重置 I2C

//确保 I2C 不忙且在
(I2cRegs.I2CSTR.bit.BB = 1)期间已停止; //忙环路
I2cRegs.I2CSTR.bit.SCD = 1; //清除 SCD 位(停止条件位)
while (I2caRegs.I2CMDR.bit.STP = 1); //停止位循环

//I2caRegs.I2CMDR.ALL = 0x6620; //开始、停止、无 rm、复位 i2c 01101110 00100000
I2cRegs.I2CMDR.bit.NACKMOD = 0; // NACK 模式位
I2caRegs.I2CMDR.bit.FREE = 1; //挂起
I2caRegs.I2CMDR.bit.STT = 1时运行空闲 I2C; //起始条件位
I2caRegs.I2CMDR.bit.STP= 0; //停止条件位
I2caRegs.I2CMDR.bit.MST = 1; //主控模式
I2caRegs.I2CMDR.bit.TRX = 1; //发送器模式
I2caRegs.I2CMDR.bit.XA = 0; // 7位寻址模式
I2caRegs.I2CMDR.bit.RM = 0; //非重复模式
I2caRegs.I2CMDR.bit.DLB = 0; //数字回送模式被禁用
I2caRegs.I2CMDR.bit.IRS = 1; // I2C 模块被使能
I2caRegs.I2CMDR.bit.STB=0; // I2C 模块不在起始字节模式
I2caRegs.I2CMDR.bit.FDF = 1; //自由数据格式模式被禁用
I2caRegs.I2CMDR.bit.BC = 0; //每个数据字节8位

while (I2cRegs.I2CSTR.bit.XRDY = 0); //在总线空闲
前不执行任何操作 I2caRegs.I2CMDR.bit.STT = 1; //起始条件位
I2caRegs.I2CDXR = 0x32;
while (I2caRegs.I2CSTR.bit.nack = 1);
I2caRegs.I2CDXR = 0x05; //传感器的寄存器地址(1个字节)
while (I2cRegs.I2CSTR.bit.nack = 1);
I2cRegs.I2CMDR.bit.STT = 1; //起始条件位
I2cRegs.I2CDXR = 0x33;
while (I2cRegs.I2CSTR.bit.nack = 1);
TempUpperByte = I2cRegs.I2CDRR;
while (I2cRegs.I2CSTR.bit.nack = 1);I2cADDR.I2CSTR.bit.NACK
= 1;I2CSTR.bit.NACKMOD = 1;
TempLowerByte = I2cRegs.I2CDRR;
while (I2cRegs.I2CSTR.bit.nack = 0);
I2cRegs.I2CMDR.bit.STP= 1;

Temperature =(TempUpperByte * 16 + TempLowerByte / 16);

Return Temperature;
} 

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

    请详细说明您面临的具体问题。 I2C 可能是一个棘手的模块、最好能够清楚地了解您所遇到的困难。

    我们不为外部器件提供驱动程序代码、但 C2000Ware 中提供了 EEPROM 示例以及 I2C 引导加载程序源代码。 您是否了解过这些内容?

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

    Mark、

    感谢您的评论。 我查看了 EEPROM 示例、但代码与我需要的代码不同。 我可以理解、不为外部器件提供驱动程序代码、但问题是 I2C 示例、解释不够满足我的需求。 您是否有任何简单的通用阅读和 wirte 库?

    我正在尝试使用我共享的代码获取给定 I2C 消息图的写入和读取序列。 我不确定写入的代码将执行此序列进行通信。 也许我做了些错误的事情。 我能否仅发送具有读取位但未设置自由数据格式位的地址?  

    您能否检查代码和注释、以了解给定 I2C 消息传递序列图是否正常?

    谢谢、  

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

    EEPROM 和 bootROM 代码是我们目前拥有的最通用的代码。

    代码是否对您无效? 它如何不起作用? 您是否在示波器上观察到了信号?

    简要看一下您的代码,它会看到您在 GetTemperature()的配置阶段设置了 Start 条件,然后继续进行更多配置。

    我还认为、在数据接收阶段、NACK 位的轮询是向后的。 NACK = 0表示接收到 ACK、NACK = 1表示接收到 NACK。

    您也不能将 I2C 设置为知道它应该接收多少字节。
    查看 I2C 引导源的 I2C_Boot.c 文件和 I2C_GetWord 函数:..\C2000Ware_ libraries\boot_rom\f2806x\v1_1\rom_sources\source
    此函数看起来与温度传感器的接收部分完全匹配。

    我希望这能让您感动。

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

    Mark、您好!

    感谢您的支持。 我可以理解这些问题。 下面列出了我的错误和建议以供记录。

    • I2C_Boot.c 文件比其他 EEPROM 示例代码更清晰。 如果您没有指出该文件、我找不到该示例、也无法理解。 它应该更容易从文件中获得。
    • 我的主要问题是为读取和写入序列移动从器件地址。 实际从器件地址应用于 I2CSAR 寄存器、由 MCU 实现读写位。 但在文档中并不清楚。
    • 另一个错误是在从传感器解析字节时发生的。 但它与 TI 无关。

    此致、