用STM32CUBEX生成的Can例程,can收发都不行,Can重定位到PB8和PB9了,初始化代码如下: APB1的clk为72M,所以波特率为250k。 static void MX_CAN_Init(void) { CAN_FilterTypeDef hcanfilter; hcan.Instance = CAN1; hcan.Init.Prescaler = 96; /*BTR-BRP,分频系数,波特率=APB1Clock/(1+CAN_BS1+CAN_BS2)/CAN_Prescaler*/ hcan.Init.Mode = CAN_MODE_NORMAL; /*正常工作模式*/ hcan.Init.SyncJumpWidth = CAN_SJW_1TQ; /*BTR-SJW 重新同步跳跃宽度 1个时间单元*/ hcan.Init.TimeSeg1 = CAN_BS1_1TQ; /*BTR-TS1,时间段1,1个时间单元*/ hcan.Init.TimeSeg2 = CAN_BS2_1TQ; /*BTR-TS2,时间段2,1个时间单元*/ hcan.Init.TimeTriggeredMode = DISABLE; /*MCR-TTCM 禁止时间触发模式,就是消息里面不带时间戳*/ hcan.Init.AutoBusOff = ENABLE; /*MCR-ABOM 使能自动管理模式,一旦硬件检测到128次11位连续的隐性位就退出离线状态*/ hcan.Init.AutoWakeUp = ENABLE ; /*MCR-AWUM 使能自动唤醒*/ hcan.Init.AutoRetransmission = ENABLE; /*MCR-NART 允许自动重传模式,当发送失败或者仲裁失败的时候硬件自动重传*/ hcan.Init.ReceiveFifoLocked = DISABLE; /*MCR-RFLM 禁止接收fifo锁定,当接收fifo的报文未被读出,下一个收到的报文覆盖原来有的报文*/ hcan.Init.TransmitFifoPriority = DISABLE; /*MCR-TXFP 优先级由发送报文的标识符来决定*/ if (HAL_CAN_Init(&hcan) != HAL_OK) { printf("can init fail\r\n"); Error_Handler(); } /** * 过滤组设置 */ hcanfilter.FilterIdHigh = 0x0000; /*以下四个值为0,表示不对任何ID过滤*/ hcanfilter.FilterIdLow = 0x0000; hcanfilter.FilterMaskIdHigh = 0x0000; hcanfilter.FilterMaskIdLow = 0x0000; hcanfilter.FilterFIFOAssignment = CAN_FILTER_FIFO0; hcanfilter.FilterMode = CAN_FILTERMODE_IDMASK; hcanfilter.FilterScale = CAN_FILTERSCALE_32BIT; hcanfilter.FilterActivation = ENABLE; hcanfilter.FilterBank = 1; if(HAL_CAN_ConfigFilter(&hcan, &hcanfilter) != HAL_OK) { printf("can init filter fail\r\n"); Error_Handler(); } } gpio初始化为: void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(hcan->Instance==CAN1) { __HAL_RCC_CAN1_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /**CAN GPIO Configuration PB8 ------> CAN_RX PB9 ------> CAN_TX */ GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); __HAL_AFIO_REMAP_CAN1_2(); /* CAN1 interrupt Init */ HAL_NVIC_SetPriority(CAN1_RX1_IRQn, 5, 0); HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn); } 发送函数为: void CanTest(void) { CAN_TxHeaderTypeDef TxHeader; CAN_RxHeaderTypeDef RxHeader; HAL_StatusTypeDef ret = HAL_OK; uint8_t RxData[8]; uint8_t TxData[8] = {0x23, 0x81, 0x60, 0x00, 0x55, 0x55, 0x08, 0x00}; uint32_t TxMailbox; uint32_t std_id = 0x601; TxHeader.RTR = CAN_RTR_DATA; TxHeader.IDE = CAN_ID_STD; TxHeader.StdId=std_id; TxHeader.TransmitGlobalTime = DISABLE; TxHeader.DLC = 8; if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox) != HAL_OK) { /* Transmission request Error */ Error_Handler(); } } 但我用can分析仪就是收不到数据,请教各位初始化和发送函数有问题吗? |
非常感谢你的支持,我后来是买了一块核心板我几块CAN模块,用杜邦线连接测试的,例程也是店家给的一直测试没问题的,刚开始测起来CAN分析仪还是收不到数据,后来就怀疑是连接有问题,将CPU到can模块的TX和RX两根线交换了下,CAN分析仪就有数据了,后来到我自己的板上测试了下,也没问题了。
所有还是我电路的问题,CAN模块的D接CPU的TX,CAN模块的R接CPU的RX,跟RS485和MAX232还是不一样的
评分
查看全部评分
昨天环回测试过了,没问题,电阻焊的是120欧的,也应该没问题。不清楚是不是can驱动器SN65HVD230芯片有问题。
野火是3.5的库,也没有STM32F103RCT6这颗料的can例程。我昨天环回实验做了,没问题。
那只要選 device 改一下就好 , 主要是 flash 大小選定 , 其餘都一 樣 , 假如回環沒問題 , 那就代表設定基本上沒問題 , 要往硬體方向去 debug 了
是在往硬件方向考虑了,重新来了核心板和can模块回来单独测试。
看手册,回环模式,CAN_TX上也有波形的,那如果外面的驱动器没问题,是不是可以理解成用示波器看can_tx上应该有波形存在的?
可以試看看 , 外面驅動器是差動訊號 , 應該也可以用示波器量 , 最好用有 can 的 LA 去解析 , 淘寶應該有便宜可以買 , 只要能看是否有 data 出來就可以
我有can分析仪的,看了下没数据,顺丰在网上买了103RCT6的核心板和can模块,搭起来还是发送不出去,这可是淘宝店家说一直在用的测试程序啊, 看来跟这个can是杠上了。现在程序也是别人说OK的,板子也全部是买的,can分析仪用买的can透传模块测试了,没问题,真是搞不懂是什么问题了。
评分
查看全部评分
感谢你的一直支持,今天终于调通了,确实是接线的问题,原来CAN驱动器跟RS485不一样,CAN的D接CPU的TX,CAN的R接CPU的RX,第一次自己画板调试Can,没仔细研究芯片就想当然的,搞了好几天了。
你有不要用回環模式 , 去送 data , 用示波器去量 mcu 出來的 RX , TX 訊號 , 假如有出來 , 再去量外面驅動器的訊號 , 去做比對 , 看2者是否波型一樣 , 不一樣硬體上就有問體 , 一樣的話 , 就要看 can 分析儀設定是否正確 , 有很多參數要設 ? baud rate 最重要 , 假如還是沒解 , 最後幾個方法
1 : 再去跟同廠家買一塊一模一樣模塊 , 用同樣程序對傳 , 排除硬體上的問題 , 跟 LA 的設定問題
2 : 把野火 3.5的 sample code 改成你現在的 , 試看看
3 : 直接買一塊野火的 開發版 , 直接用 野火的 sample code 去玩 , 玩熟了 , 再一個個改成你現在的測試環境
解决了问题来总结回帖,这个习惯很好,可以将总结置顶