Creator 4.0-PSOC 5:I2C Slave

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

你好,

随附的 i2c_4_int.c 包含创建者创建的代码。 我没有修改它。

当我尝试从 PSOC 读取数据时,几次之后,我遇到了由第 509 行(CYASSERT)引起的异常

 

...
}
            else
            {
            #if(I2C_4_TIMEOUT_ENABLED)
                /* Exit interrupt to take chance for timeout timer to handle this case */
                I2C_4_DisableInt();
                I2C_4_ClearPendingInt();
            #else
                /* Block execution flow: unexpected condition */
                CYASSERT(0u != 0u);
            #endif /* (I2C_4_TIMEOUT_ENABLED) */
            }

 

是什么 CAN 导致这种未定义的状态?

随附的 i2c.c 包含 2 个例程,用于从主机 (i2csl averecieveMsg) 读取 I2C 消息并向主机 (i2cslaveSendMsg) 发送 I2C 消息 (i2cslaveSendMsg)。

CAN 请您判断此代码是否错误?

谢谢,

兹维卡

0 点赞
15 回复数
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 @zvivered,你

能解释一下你的项目吗?

从你的代码 (i2c.c) 来看,你是如何从其他人那里调用 i2cslav  e ReceiveMsg 函数的?
每次你想从主服务器接收 I2c 数据时,你是在主任务或其他任务中调用那个函数吗?

有一个功能可以设置接收到的 I2C 数据的缓冲区。

i2c_4_slaveinitWriteBuf ((uint8*) pmsg,maxMsgSize);


设置缓冲区后,然后使用 I2C_4_Start 启动 i2c。I2C 将运行,所有接收到的数据都将存储在该缓冲区中。 我们 CAN 使用 I2C_4_SlaveStatus() 检查缓冲区状态。

请参考I2C从站的代码示例 DelSig_I2CS 

热烈的问候
ADSW


0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 ADSW,

非常感谢你的回复。

根据数据表中的代码,我修改了 i2C.c 并上传了它。

我还上传了 i2cTask.c

i2cTask 在 FreeRTOS 下运行。 这是一个 while (1) 循环,顺序如下:

while (1)
{
     I2cSlaveRecieveMsg (); // Read incoming message from I2C master

     I2cSlaveSendMsg (); //Send reply to I2C master 
}

主站正在向 PSOC 发送一条 12 字节的消息。

PSOC 向主站发回一条 198 字节的消息。

3、4 或 5 个周期后,主端的读取会挂起,然后我在 PSOC 中看到了异常。

谢谢,

兹维卡

 

 

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

嗨 @zvivered

3、4 或 5 个周期后,主端的读取会挂起,然后我在 PSOC 中看到了异常。
你的意思是另一台设备作为主设备然后它挂起了然后问题出现了吗?

最好使用 i f 而不是 wh il e 作为条件,一旦满足条件,它就会被困在循环中(while)。

热烈的问候,

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 ADSW,

在 3 到 5 次迭代(主服务器发送请求,主服务器接收回复)后,主服务器中读取的 I2c 挂起。

发生这种情况时,PSOC 中就会出现例外。

你是什么意思:"最好用 if 而不是 while..."。 CAN 请在我的代码中指定确切的位置?

谢谢,

兹维卡

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 @zvivered

在你的 I2cSlaveRecieveMsgI2cSlaveSendMsg 函数中,为了避免任务被困在 while-condition 中,我们 CAN 用 If条件 更改它,并清除其中的状态和缓冲区。
那我们就来观察一下吧。

热烈的问候,

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 ADSW,

请检查 i2cslaveSendMsg(例如) :我稍微改变了
while 循环。

我应该完全避开 while 循环吗?
我必须进行"民意调查"直到交易结束。
我应该    在 while 循环中调用I2C_4_SlaveClearReadStatus吗?这 CAN 将状态从完成修改回空闲。我错了吗?
int I2cSlaveSendMsg (void *pMsg, int msgSize)
{
    I2C_4_SlaveClearReadStatus();
    I2C_4_SlaveInitReadBuf((uint8 *) pMsg, msgSize);

    while (1)
    {
          if (I2C_4_SlaveStatus() & I2C_4_SSTAT_RD_CMPLT)
          {
                   break;
          }

         vTaskDelay(10 / portTICK_PERIOD_MS);
     }

     return I2C_OK;
}​

 

非常感谢,

兹维卡

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 @zvivered

我得在交易结束"之前进行"民意调查。
这个常量值 I2C_4_SSTAT_RD_CMPLT 表示主服务器发送 NAK 表示读 取已完成。 如果连接中断或主服务器没有响应(没有 NAK),则这些条件将无法满足。
然后,如果你想进行轮询,请在 while-loop 中给出超时条件。

例如

int I2cSlaveSendMsg (void *pMsg, int msgSize, uint16_t timeoutTick)
{
    int res = 0;
    I2C_4_SlaveClearReadStatus();
    I2C_4_SlaveInitReadBuf((uint8 *) pMsg, msgSize);
    uint16_t tick = 0;
    while (1)
    {
          if (I2C_4_SlaveStatus() & I2C_4_SSTAT_RD_CMPLT)
          {
                   res = I2C_OK;
                   break;
          }
          vTaskDelay(10 / portTICK_PERIOD_MS);
          tick++;
          if(tick>=timeoutTick)
          {
             res = I2C_ERR;
             break;
          };
     }
     return res;
}


热烈的问候,

 

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 ADSW,

我修改了代码,并在从站向主站发送消息时添加了超时检查。

但不幸的是,这并没有解决问题。

在第二次/第三次迭代中,当 master 等待响应时,PSOC 如我所描述的那样出现异常。

未达到超时条件。(勾选 T < imeOutTick)

最诚挚的问候,

兹维卡

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好@zvivered 

您能否分享您的项目,以便我们 CAN 帮助您调试代码?

谢谢

0 点赞
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 ADSW,

很抱歉我回复晚了。

附上带有完整源代码的 zip。 在此版本中,仅启动了一项任务:i2cTask.c

此任务等待来自 I2C 主站的消息(长 12 字节,结构 PC_TO_TGT_READ_TELEMETRY_REQUEST)并发送回答案(长 152 字节,结构 TGT_TO_PC_READ_TELEMETRY_REPLY)

最诚挚的问候,

兹维卡

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 @zvivered

我没发现你的 I2C 部分有什么问题。
可能它来自 CAN 使内存溢出的malloc。
尝试调整 ram 和 FREERTOS 的堆大小并进行检查。

热烈的问候
ADSW

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 ADSW,

我非常感谢你的努力。

昨天我检查了一张旧卡上的代码,其主板设计略有不同。

我 CAN解释,但是在这张卡上,代码工作正常。 希望我 CAN 尽快更新导致 I2C 异常的原因。

非常感谢,

兹维卡

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

@zvivered

非常感谢您的确认。
我可以关闭这个话题吗?
如果是,那么你可以通过打开一个引用锁定话题的新话题来继续讨论这个话题。

热烈的问候,
ADSW

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager
你好 ADSW,

请关闭这个话题。

最诚挚的问候,
Zvika
0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好 @zvivered

我会关闭这个话题。

非常感谢你的确认

热烈问候
ADSW

0 点赞