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.

[参考译文] C2000 - Simulink TI F2838x C28x I2C 发送

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1017581/c2000---simulink-ti-f2838x-c28x-i2c-transmit

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

大家好、  

我正在使用28388D 控制卡、并尝试让 I2C 通信与 Simulink EmbedCoder 一起工作、

我首先从 CCS C 代码 I2C 示例开始、并对数据包进行了修改、使其正常运行、这是一个非常简单的代码、通过单个器件即可对芯片中的5个寄存器进行写入和读取。 因此可以证明硬件工作正常。

最终软件设计将在 Simulink EmbedCoder 问题中完成、我在该设计中遇到了问题。 尝试使用嵌入式 I2C 块、而不是使用自定义代码/s 函数。

在 CCS 上生成代码并运行代码并进行调试后、I2C 会接收消息、但不会发送消息。  

问题似乎出在线路"while (I2caRegs.I2CFFTX.bit.TXFFST!=0 & TX_LOOP<10000)"、其中 TXFFST 永远不等于零。 Simulink 中是否缺少某项内容来清除此问题?

下面是模型设置  

生成的代码

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if (rtb_Compare) {
/* S-Function (c280xi2c_tx): '<S9>/I2C Transmit' incorporates:
* Constant: '<S3>/Control Reg2'
*/
{
int unsigned tx_loop= 0;
I2caRegs.I2CFFTX.bit.TXFFIENA = 0;/* Disable Tx Fifo interrupt*/
while (I2caRegs.I2CFFTX.bit.TXFFST!=0 && tx_loop<10000 )
tx_loop++;
if (tx_loop!=10000) {
I2caRegs.I2CSAR.bit.SAR = 0; /* Set slave address*/
I2caRegs.I2CCNT= 1; /* Set data length */
/* mode:1 (1:master 0:slave) Addressing mode:0 (1:10-bit 0:7-bit)
free data mode:0 (1:enbaled 0:disabled) digital loopback mode:0 (1:enabled 0:disabled)
bit count:0 (0:8bit) stop condition:1 (1:enabled 0: disabled)*/
I2caRegs.I2CMDR.all = 28192;
tx_loop= 0;
while (I2caRegs.I2CFFTX.bit.TXFFST==16 && tx_loop<10000)
tx_loop++;
if (tx_loop!=10000) {
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Simulink 硬件设置

我不熟悉 C2000系列和 Simulink、因此我希望这是一个我遗漏的简单修复!  

此致、

Neil

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

    尼尔

    感谢您发布块代码、我将与我们团队的 I2C 所有者联系、看看内联代码是否有任何变化。  如果我们发现缺少某些内容、并且无法确定如何通过 GUI 实施、我们可以加入 MW 团队。

    您能评论一下您在 C2000Ware 中使用的哪一个示例工作正常吗?  这将为我们提供与 Simulink 生成的代码不同的内容。

    最棒的

    Matthew

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

    你好、Matthew

    它是文件夹中的 i2c_ex2_EEPROM 项目。  C2000Ware_3_04_00_00\driverlib\f2838x\examples\C28x\i2c

    谢谢

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

    尼尔

    您是否已启用 TX FIFO 和 RX FIFO 以开始? 您只在代码片段中附带了什么内容、我不确定您是否已启用 FIFO、如下所示。 此外、当您遇到此错误时、TXFFST 位的状态是什么? TXFFST = 0吗?

    要使用 TX FIFO、您需要进行设置

    I2CFFTX.I2CFFEN = 1

    I2CFFTX.TXFFRST = 1.

    要使用 RX FIFO、您需要进行设置

    I2CFFRX.RXFFRST = 1

    此致、

    曼诺伊

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

    您好 Manoj

    并不一定需要 FIFO 功能、因为它的消息速率很低、

    从我在 Simulink 硬件设置中可以看到、没有禁用/启用 FIFO 的选项、尽管查看生成的 c 代码(在下面提取)、Simulink 的默认值似乎是启用 FIFO?  

    与 FIFO 相关的唯一选项是选择 FIFO 中断级别? (所有中断被禁用)

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void init_I2C_GPIO(void)
    {
    EALLOW; /* Initial I2C GPIO pin*/
    GpioCtrlRegs.GPCPUD.bit.GPIO91 = 0; /* Enable pull-up on GPIO91 (SDAA)*/
    GpioCtrlRegs.GPCGMUX2.bit.GPIO91 = 1;/* Configure GPIO91 as SDAA*/
    GpioCtrlRegs.GPCMUX2.bit.GPIO91 = 2; /* Configure GPIO91 as SDAA*/
    GpioCtrlRegs.GPCPUD.bit.GPIO92 = 0; /* Enable pull-up on GPIO92 (SCLA)*/
    GpioCtrlRegs.GPCGMUX2.bit.GPIO92 = 1;/* Configure GPIO92 as SCLA*/
    GpioCtrlRegs.GPCMUX2.bit.GPIO92 = 2; /* Configure GPIO92 as SCLA*/
    EDIS;
    }
    void init_I2C_A(void)
    {
    /* Initialize I2C*/
    EALLOW;
    CpuSysRegs.PCLKCR9.bit.I2C_A = 1; /* Enable pheripheral clocks for I2C */
    EDIS;
    I2caRegs.I2CMDR.bit.MST = 1; /* Select master or slave mode*/
    I2caRegs.I2CMDR.bit.DLB = 0; /* Enable digital loopback bit */
    I2caRegs.I2CPSC.all = 199; /* Prescaler - need 7-12 Mhz on module clk*/
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    TXFFST 值为2这在原始 POST 代码的 while 循环行8上使用断点)或使用连续刷新选项(如果这是快速更改、则刷新选项可能会更新该值)

    FIFO I2CFFEN 和 TXFFRST 的其他值 似乎与您建议使用的值相匹配、并且我尚未修改 Simulink 生成的任何代码  

    非常感谢、

    Neil

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

    TXFFST = 2告诉我您的 TXFIFO 中有2个字。 TXFFST 位域只有在 TXFIFO 中的内容被传输时才可读为"0"。 这只能通过生成 START 条件来实现。

    我从未使用 Simulink 生成 I2C 代码。 您是否使用 Simulink 进行了检查?

    此致、

    曼诺伊

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

    尼尔

    此问题是否已解决? 我可以关闭此主题吗?

    此致、

    曼诺伊