ST意法半导体
直播中

陈飞

7年用户 1173经验值
私信 关注
[问答]

STM32F103C8上的CAN模块在正常模式下无法启动怎么解决?

当我在环回模式下运行 CAN 模块时 - 数据包
转移到公共汽车 - 一切都很好
当我以静默模式运行 CAN 模块时,我将收到数据包 - 一切正常
但是当我在正常模式下启动 CAN 模块时——TX 引脚上发出 15 个脉冲,一切都停止了……数据包没有传输……
我究竟做错了什么???
我使用以下方法生成了启动配置:
STM32CubeMX 5.6.1
固件为STM32Cube FW_F1 V1.8.0
Atollic TrueSTUDIO 版本:9.3.0 构建 ID:20190212-0734
我一直在结合 ISO1050 和 MCP2551 ...
我用中文逻辑分析仪看了总线....
连接到 RX 和 TX 引脚的并行
代码:
/* 私有定义 ------------------------------------------ --------------*/
/* 用户代码开始 PD */
#define TxBroadcastVoltagIdentifier 0x5FF400C
#define TxDeviceRegistrationFeedbeckIdentifier 0x5004804
#define TxSetDefaultVoltageIdentifier 0x5FF400C
/* 用户代码结束 PD */
/* 私有变量-------------------------------------------- ----------*/
CAN_HandleTypeDef hcan;
/* 用户代码开始 PV */
CAN_FilterTypeDef FlatPackRXFilter;
CAN_RxHeaderTypeDef RxHeader;
uint8_t RxData[16];
uint32_t RxFifo;
CAN_TxHeaderTypeDef TxHeader;
uint8_t TxData[16];
uint32_t TxFifo;
uint8_t 测试;
/* 用户代码结束 PV */
int 主要(无效)
{
/* 用户代码开始 1 */
/* 用户代码结束 1 */
/* 单片机配置-------------------------------------------- ----------*/
/* 重置所有外设,初始化 Flash 接口和 Systick。*/
HAL_Init();
/* 用户代码开始初始化 */
/* 用户代码结束初始化 */
/* 配置系统时钟 */
SystemClock_Config();
/* 用户代码开始 SysInit */
// hcan.Instance->BTR &= ~CAN_MCR_SLEEP;
// hcan.Instance->MSR = CAN_MSR_SLAK;
/* 用户代码结束 SysInit */
/* 初始化所有配置的外设 */
MX_GPIO_Init();
MX_CAN_Init();
/* 用户代码开始 2 */
FlatPackRXFilter.FilterBank = 0;
FlatPackRXFilter.FilterActivation = CAN_FILTER_ENABLE ;
FlatPackRXFilter.FilterFIFOAssignment = CAN_FILTER_FIFO0;
FlatPackRXFilter.FilterIdHigh = 0;
FlatPackRXFilter.FilterIdLow = 0;
FlatPackRXFilter.FilterMaskIdHigh = 0;
FlatPackRXFilter.FilterMaskIdLow = 0;
FlatPackRXFilter.FilterMode = CAN_FILTERMODE_IDMASK;
FlatPackRXFilter.FilterScale = CAN_FILTERSCALE_32BIT;
如果 (HAL_CAN_ConfigFilter(&hcan, &FlatPackRXFilter) != HAL_OK)
{
  错误处理程序();
}
如果 (HAL_CAN_Start(&hcan) != HAL_OK)
{
  错误处理程序();
}
如果(HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_MSG_PENDING)!= HAL_OK)
{
  错误处理程序();
}
如果(HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO0_OVERRUN)!= HAL_OK)
{
        错误处理程序();
}
TxHeader.ExtId = TxBroadcastVoltagIdentifier;
TxHeader.DLC = 8;
TxHeader.IDE = CAN_ID_EXT;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.TransmitGlobalTime = 禁用;
HAL_延迟(100);
TxData[0]=0x32;
TxData[0]=0xF0;
如果 (HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxFifo) != HAL_OK)
{
  错误处理程序();
}
/* 用户代码结束 2 */
/* 无限循环 */
/* 用户代码开始时 */
而 (1)
{
  /* 用户代码结束 */
  /* 用户代码开始 3 */
         test = HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxFifo);
         如果(测试!= HAL_OK)
         {
          错误处理程序();
         }
         HAL_延迟(100);
}
/* 用户代码结束 3 */
}
/* 用户代码开始 4 */
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
        如果 (HAL_CAN_GetRxMessage(hcan, RxFifo, &RxHeader, RxData) != HAL_OK)
        {
                错误处理程序();
        }
}
/* 用户代码结束 4 */









回帖(1)

h1654155275.5879

2023-1-13 15:39:43
发现了问题所在……我的 can 收发器电源错误(MCP2551 需要 5V,ISO1050 需要从两侧供电)
由于 TX CAN tansiver 输入的所有内容立即从 RX CAN 收发器的输出“退出”,因此当微控制器将数据包发送到 TX 通道时,他希望在 RX 输入处看到这个包裹...... .如果它没有看到这个数据包(数据包的第一位),它会立即中断传输并设置“位显性错误”标志,这在 STM32f103 的参考手册中没有以任何方式描述
举报

更多回帖

发帖
×
20
完善资料,
赚取积分