公告

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

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

你好。 我正在开发 PSOC 4200 CY8C4245AXI。 我正在尝试让 RS-485 通信正常运行,但到目前为止一直没有成功。 由于布局和资源限制,我必须使用 SCB UART 资源,而不是具有 tx_en 输出的 UART 组件,这意味着我必须在每次 UART 传输后手动禁用 Tx,因为这是半双工。

我所期望的:

1。通过 RS-485 将数据发送到 PSOC UART

2。字节被插入到 Rx FIFO

3。在主循环中,"Uart_uartGetChar () 被调"用,其值为非零表示FIFO中有东西并且已出队。

4。启用传输

5。发送已出队的角色

6。等到 " UART Done " Tx 中断被触发 while 循环。

7。禁用传输

8。清除中断

9。根据最初发送的字节数,转到 1 或 3。

 

如果我发送一个字节,它通常会回显。 但是每零一次? 相反,它会回荡一些无关的东西。 不是位移或其他任何东西,但是如果你发送相同的数据,它似乎总是相同的。 例如,发送字符 " " a " 通常"会回复,但也会随机插入 0xD8。

如果我一次发送多个字节,我希望它们会被插入到FIFO中并进行处理,直到FIFO为空,每个字节之间都会出现繁忙循环。 实际发生的事情非常奇怪,因为如果我发送两个字符,比如 " ab",(我测试过的任何两个字符都会发生)。 它根本不会回响任何东西。 但是,如果你发送三个字符,比如 " abc",它只会回显 " c "。 但是它像以前一样用虚假的故障回荡,"通常会回显 " c,但有时会回显其他一些数据。 它只会回显收到的最后一个字节,而其他字节将被忽略。 "收到"的其他数据与您只发送最后一个字节的数据相同,因此,如果您只发送 " c,"它将返回 c,并返回 0x " EC " 的虚假故障。

 

如果有人 CAN 提供一些指导,那就太好了。 附上该项目。 此示例基于 PSOC Creator 上的 PSOC 4200 SCB UART 示例,并针对我的硬件进行了修改。

第一张图片正在"反复"发送。 第二个是"反复发送 " abc。 回复是一个字节,显示的是该字节的十六进制值。 因此,将每个空格解释为发送 ascii 数据之间的分隔。 我没有附上第一个示例的输出,因为它只会接收一个字节而不接收其他任何内容。

 

编辑:更新是因为 ISR 版本由于我犯了一个愚蠢的错误而失败。 但是,它的行为与已删除的以前的"繁忙循环"版本不同。

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

@RossSmyth

你好。你用什么来做 RS485 线路驱动器/接收器?

注意:当 RS485 总线未被驱动时,并非所有接收机都具有已知的默认逻辑状态。

另外,你在 + 和-信号之间使用的是 120 还是 150 欧姆的终端电阻?

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

它确实有一个带有 SN65ALS176D 的 120 欧姆端接电阻。 设计电路板的电气工程师上面有一些硬件,所以我相信在不驱动时它的状态确实很低。

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

我已经更新了主帖子,因为以前有两个不同的例子以不同的方式失败。 我在其中发现了一个错误。 但是现在只有一个,因为一旦我修复了错误,中断版本的作用与"繁忙循环"版本相同。

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

我能够通过更改来解决虚假错误

for (;;)
{
    uint32_t ch = UART_UartGetChar();
    if (0u != ch)
    {
        UART_UartPutChar(ch);
    }
}

从最初的例子到

for (;;)
{
    uint32_t ch = UART_UartGetChar();
    if (0u != ch)
    {
        char buf[16] = {};
        sprintf(buf, "%c", ch);
        UART_UartPutString(buf);
    }
}

出于某种原因。

这并不能解决一次发送多个字节的问题。 尽管我发现了一个有趣的模式。

如果我发回一条诸如 " hello %c 之类的消息",比如我发送 'a',它就会回复 " hello a "。 如果我发送 " ab",它会一个接一个地回复"你好 a",如果我发送 " abc " 它会回复哈"哈 a "。 因此,根据发送的数量,它似乎可以减少回复的数量。

但是,如果我进入调试器并逐步完成调试器,它会按预期回复。 发送 " ab",回复 " hello a " 然后再次跳过然后"你好 b "。

0 点赞