我在使用英飞凌TC377芯片,当我改变CAN 控制器状态,将
```
CCCRi.INIT -- >NORMAL
```,但是PSRi.ACT一直保持在SYNCHRONIZING状态,应该时IDLE状态才对,我检查了时钟和波特率的设置,没有发现问题,到底是哪里的问题呢?怎么解决?
我在使用英飞凌TC377芯片,当我改变CAN 控制器状态,将
```
CCCRi.INIT -- >NORMAL
```,但是PSRi.ACT一直保持在SYNCHRONIZING状态,应该时IDLE状态才对,我检查了时钟和波特率的设置,没有发现问题,到底是哪里的问题呢?怎么解决?
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
根据您提供的信息,您的CAN控制器状态从INIT(初始化)转变为NORMAL,但是PSRi.ACT状态一直保持在SYNCHRONIZING状态。这通常表明您的CAN控制器正在等待同步,因此使用一个正确的时钟可以解决这个问题。
以下是一些可能有助于解决您的问题的建议:
确保CAN控制器的时钟源正常连接,并且每个CAN节点的时钟设定相同。因为CAN总线需要在所有节点之间进行同步,否则数据传输将被破坏。
检查波特率的设置是否正确,确保在所有节点之间使用相同的波特率设置,并确认波特率不太高或太低。频率较高,容易发生同步问题。
检查CAN总线上是否存在干扰,例如在毗邻的线路上运行的电机或让设备附近在其他电子产品的电磁干扰。
下面是一个代码示例,可以尝试使用该代码看看是否能够解决问题,代码中假设时钟源是一个外部晶振,波特率设置为500kbps:
#include <mcp_can.h> //可以使用mcp_can库操作CAN控制器
#include <SPI.h>
// MCP2515 CAN Module
MCP_CAN CAN(10); // CS Pin 10 for MCP2515
unsigned char canData[8] = {'H', 'E', 'L', 'L', 'O', ' ', 'W', 'D'};
void setup()
{
Serial.begin(115200);
if(CAN_OK == CAN.begin(MCP_STDEXT, CAN_500KBPS, MCP_8MHZ))
{
Serial.println("CAN BUS Shield init ok!");
}
else
{
Serial.println("CAN BUS Shield init failed");
}
CAN.setMode(MCP_NORMAL);
// Send data on CAN BUS
CAN.sendMsgBuf(0x123, 0, 8, canData);
}
void loop()
{
unsigned char len = 0;
unsigned char buf[8];
if(CAN_MSGAVAIL == CAN.checkReceive())
{
CAN.readMsgBuf(&len, buf);
Serial.println("-----------------------------");
Serial.print("Get Data from ID: ");
Serial.println(CAN.getCanId());
for(int i = 0; i<len; i++)
{
Serial.print(buf[i]);
}
Serial.println();
}
}
希望这些信息对您有所帮助!
如果我的回答解决了您的问题,请采纳!