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.

[参考译文] F28M36P63C2:I2C 写入与 F28m36x 控制器的 C28不工作。

Guru**** 2524550 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/818035/f28m36p63c2-i2c-write-not-working-with-c28-of-f28m36x-controller

器件型号:F28M36P63C2
Thread 中讨论的其他器件:controlSUITE

我尝试使用 C28的 i2c 端口向 DAC 芯片发送数据、但失败了、我可以使用 controlSUITE 中提供的示例通过 M3发送 i2c 数据。 但 controlSUITE 中的 F28m36x 没有带 C28的 I2C 示例。 因此、我使用了类似控制器系列的示例 i2c_EEPROM 代码作为参考。  

但我无法使用 i2c 发送任何数据、我可以在示波器上看到从器件地址字节、之后时钟信号一直保持低电平、并且在该字节之后看不到数据。(无论连接或断开外部硬件(DAC)、都会发生这种情况)

TI 是否有任何来源可以找到 F28m36x C28内核的 I2C 示例代码? 即使 F28M36x_I2C.c 库代码看起来也不完整。

注意:外部上拉用于 GPIO32、33 I2C 引脚、因为 C28中的软件没有可用的上拉配置。

我将使用以下配置发送数据。 我使用(http://e2e.ti.com/support/microcontrollers/c2000/f/171/t/268548?I2C-Nothing)作为时钟设置的参考。

空 InitI2CGpio()

EALLOW;

/*为所选引脚启用内部上拉*/

//用户可以启用或禁用上拉。
//这将启用指定引脚的上拉电阻。
//注释掉其他不需要的行。

//GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0;//启用 GPIO32的上拉电阻(SDAA)
//GpioCtrlRegs.GPBPUD.bit.GPIO33 = 0;//启用 GPIO33的上拉
//(SCLA)

/*将所选引脚的限定条件设置为仅异步*/

//这将为所选引脚选择异步(无限定条件)。
//注释掉其他不需要的行。

GpioCtrlRegs.GPBQSEL1.bit.GPIO32 = 3;//异步输入 GPIO32 (SDAA)
GpioCtrlRegs.GPBQSEL1.bit.GPIO33 = 3;//异步输入 GPIO33 (SCLA)

/*使用 GPIO 寄存器配置 I2C 引脚*/

//这指定哪些可能的 GPIO 引脚将是 I2C 功能引脚。
//注释掉其他不需要的行。

GpioCtrlRegs.GPBMUX1.bit.GPIO32=1;//为 SDAA 配置 GPIO32
//操作
GpioCtrlRegs.GPBMUX1.bit.GPIO33=1;//为 SCLA 配置 GPIO33
//操作

EDIS;


空 I2CA_Init (空)

I2caRegs.I2CSAR = 0x60;// DAC 的从器件地址


I2caRegs.I2CPSC.all = 14;//对于 CPU_FRQ_150MHz、SYSCLK/(I2CPSC+1)

I2caRegs.I2CCLKL = 76;//注意:必须为非零
I2caRegs.I2CCLKH = 38;//注:必须为非零
I2caRegs.I2CIER.ALL = 0x0;//启用 SCD 和 ARDY 中断

I2caRegs.I2CMDR.ALL = 0x0020;//使 I2C 退出复位

I2caRegs.I2CFFTX.ALL = 0x6000;//启用 FIFO 模式和 TXFIFO

返回;

void I2C_write_new()

uint16 i = 0;
//设置从地址
I2caRegs.I2CSAR = 0x60;

while (I2cRegs.I2CSTR.bit.BB = 1)

I = 1;

I2caRegs.I2CCNT = 3;

I2caRegs.I2CDXR = 0x60;
I2caRegs.I2CDXR = 0x66;
I2caRegs.I2CDXR = 0x60;

I2caRegs.I2CMDR.bit.TRX = 1;//设置为发送模式
I2caRegs.I2CMDR.bit.STP= 1;//一旦 Tx 完成,即 I2CCNT =0,主器件必须释放总线
I2caRegs.I2CMDR.bit.MST = 1;//设置为主模式
I2caRegs.I2CMDR.bit.FREE = 1;//调试器不会在断点上停止总线
I2caRegs.I2CMDR.bit.STT = 1;//发送起始位、传输将跟随
//将 START 作为主发送器发送
// I2caRegs.I2CMDR.ALL = 0x6E20;

在发送 i2c 数据之前和之后、我连接了 I2CMDR 寄存器设置。

前-> 后->

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

    我们没有专门针对 F28M36x 的 C28侧的示例、但您正确地使用了另一个 C28器件的 i2c_EEPROM 示例之一-除了 FIFO 大小可能发生的一些变化外、I2C 是相同的。

    只是为了澄清、在发送从器件地址时、时钟确实会切换-之后它只是保持低电平、对吧? 听起来可能就是 本页"硬件对 NACK 的响应"一节中所述的内容。 您能否检查 I2CSTR 中的状态位并尝试该页面针对 NACK 处理的建议?

    惠特尼

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

    是基于该 wiki 链接、我正在检查 I2CSTR 中的 ARDY 状态位、设置并清除 STP 和 NACK 寄存器。 现在、我的时钟信号恢复为高电平。 但我仍然只能看到地址字节、之后 SDA 和 SCL 都保持高电平。

    我正在尝试根据 FIFO 传输发送数据、并使用以下设置启用该数据。

    I2caRegs.I2CFFTX.ALL = 0x6000;  //启用 FIFO 模式和 TXFIFO

    我的 I2C 初始化和 I2C 写入如下:

    空 I2CA_Init (空)

    I2caRegs.I2CSAR = 0x60;// DAC 的从器件地址


    I2caRegs.I2CPSC.all = 14;//对于 CPU_FRQ_150MHz、SYSCLK/(I2CPSC+1)

    I2caRegs.I2CCLKL = 10;//注意:必须为非零
    I2caRegs.I2CCLKH = 5;//注意:必须为非零
    I2caRegs.I2CIER.ALL = 0x0;//启用 SCD 和 ARDY 中断

    I2caRegs.I2CMDR.ALL = 0x0020;//使 I2C 退出复位

    I2caRegs.I2CFFTX.ALL = 0x6000;//启用 FIFO 模式和 TXFIFO

    返回;

    void I2C_write_new()

    uint16 i = 0;
    //设置从地址
    // I2caRegs.I2CSAR = 0x60;

    while (I2cRegs.I2CSTR.bit.BB = 1)

    I = 1;

    I2caRegs.I2CCNT = 3;

    I2caRegs.I2CDXR = 0x60;
    I2caRegs.I2CDXR = 0x66;
    I2caRegs.I2CDXR = 0x60;

    I2caRegs.I2CMDR.bit.TRX = 1;//设置为发送模式
    I2caRegs.I2CMDR.bit.STP= 1;//一旦 Tx 完成,即 I2CCNT =0,主器件必须释放总线
    I2caRegs.I2CMDR.bit.MST = 1;//设置为主模式
    I2caRegs.I2CMDR.bit.FREE = 1;//调试器不会在断点上停止总线
    I2caRegs.I2CMDR.bit.STT = 1;//发送起始位、传输将跟随
    //将 START 作为主发送器发送
    // I2caRegs.I2CMDR.ALL = 0x6E20;

    while (!(I2caRegs.I2CSTR.bit.ARDY));

    if (I2cRegs.I2CSTR.bit.nack)

    I2caRegs.I2CMDR.bit.STP= 1;
    I2caRegs.I2CSTR.bit.nack = 1;

    我正在尝试发送3个字节的数据并且数据被提供给 I2CDXR、是否需要任何其他寄存器设置来发送 FIFO 数据?

    谢谢

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

    您的 FIFO 设置似乎正常。 当您单步执行对 I2CDXR 的写入时、您是否会看到 I2CFFTX 中的 FIFO 水平状态在增加? 在运行其余代码后、您是否看到它返回到0? I2CCNT 呢? 运行代码后、它是否返回0?

    惠特尼

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

    是的、I2CFFTX 中的 TXFFST 在 I STEP 通过 I2CDXR 写入时增加到3。 I2CCNT 也会变为3。 但是、即使在 i2c 开始发送"I2caRegs.I2CMDR.bit.STT = 1;"后、两个寄存器也保持在3。

    I2CFFTX 状态-->

    I2CSTR 状态-->

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

    您好、Whitney、

    我删除了 FIFO 发送代码、并尝试通过轮询 XRDY 寄存器来发送3个字节的数据。 在"I2caRegs.I2CMDR.bit.STT = 1"执行后、我将轮询 XRDY 寄存器并发送数据。 最初、XRDY 位为1、在我发送数据的第一个字节后、它设置为0、从不复位为1、并且在示波器上的地址字节之后看不到任何数据。  

    根据 TRM、当 XRDY 为1时"I2CDXR READY:data has been copied from I2CDXR to I2CXSR"、因此在我将数据提供给 I2CDXR 后、在内部不会将数据发送到 I2CXSR 以使 XRDY 为1。 (1229页)

    只有当 XRDY 位为1时、我才能发送第二个字节的数据、并且可以假设第一个字节已成功发送。 I2C 写入的代码片段如下:

    void I2C_write_new_nofifo()
    {
    uint16 i = 0;
    //设置从地址
    I2caRegs.I2CSAR = 0x60;
    
    I2caRegs.I2CCNT = 3;
    I2caRegs.I2CMDR.bit.TRX = 1; //设置为发送模式
    I2caRegs.I2CMDR.bit.STP= 1; //一旦 Tx 完成,即 I2CCNT =0,主设备必须释放总线
    I2caRegs.I2CMDR.bit.MST = 1; //设置为主模式
    I2caRegs.I2CMDR.bit.FREE = 1; //调试器不会在断点上停止总线
    I2caRegs.I2CMDR.bit.STT = 1; //发送起始位,传输将跟随
    
    
    for (i=0;i<3;i++)
    {
    while (I2cRegs.I2CSTR.bit.XRDY = 0){};//在总线空闲前不执行任何操作
    I2caRegs.I2CDXR =(无符号整型) ulDataTx[i];//下一个数据字节
    }
    
    } 

    我的 I2C 初始化如下:

    void I2CA_Init (void)
    {
    I2caRegs.I2CPSC.all = 14;//对于 CPU_FRQ_150MHz、SYSCLK/(I2CPSC+1)
    
    I2caRegs.I2CCLKL = 45; //注意:必须为非零// SCL 100kHz
    I2caRegs.I2CCLKH = 45; //注:必须为非零
    I2caRegs.I2CIER.ALL = 0x0; //启用 SCD 和 ARDY 中断
    
    I2caRegs.I2CMDR.ALL = 0x0020;//使 I2C 退出复位
    返回;
    } 

    是否缺少任何寄存器设置来从 I2CDXR ->  I2CXSR 移动数据?

    I2CCNT 保持为3并且不会递减。

    状态寄存器如下:

    Karthik

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

    您是否看到 DAC ACK 已识别其地址? 如果您看看 SDA 信号、您是否能够实际看到 ACK? 看起来 NACK 位只是连续置位、因此 C28 I2C 甚至不会尝试发送数据。

    您是否确信您的从属设备正在工作并且您满足了其要求(正确的地址、正确的时钟速度等)?

    惠特尼

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

    是的、我解决了由于中间有一个数字隔离器而无法接收 DAC ACK 的问题。 此硬件设置在 M3上没有任何问题、c28在没有 ACK 的情况下不发送下一个字节。 我的 C28是否可以忽略 ACK 位并继续发送数据字节?

    谢谢