
<span style="font-size: medium; "><span style="font-family: 宋体; "> 各位砖家: 使用stm32的开发板有一个多月了,在实验can端口,碰到了问题,can_TX管脚没有数据输出,想了很多办法一直没有解决。 --------------------------------------------------------------------------------------------------------------------------- 首先是开发板的例程,can工作的回环模式(CAN_Mode_LoopBack) 按照ST的参考手册,此时TX内部与RX连接,同时外部的TX脚仍然有信号输出。 例程下载成功,也从串口收到了成功的提示信息,如: 这个一个CAN(回环模式和中断模式)测试程序...... CAN 回环测试初始化成功...... CAN 回环测试成功...... 这个一个CAN(回环模式和中断模式)测试程序...... CAN 回环测试初始化成功...... CAN 回环测试成功...... 但无论是示波器,还是逻辑分析仪,都无法从CAN_TX(PB9)上采集到相关的CAN数据。 --------------------------------------------------------------------------------------------------------------------------- 在这个例程中,CAN初始化是这样的: /* * 函数名:CAN_GPIO_Config * 描述 :CAN GPIO 和时钟配置 * 输入 :无 * 输出 : 无 * 调用 :内部调用 */ static void CAN_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOA, ENABLE); /* CAN1 Periph clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); /* Configure CAN pin: RX */ // PB8 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入 GPIO_Init(GPIOB, &GPIO_InitStructure); /* Configure CAN pin: TX */ // PB9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); //#define GPIO_Remap_CAN GPIO_Remap1_CAN1 本实验没有用到重映射I/O GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE); } /* * 函数名:CAN_NVIC_Configuration * 描述 :CAN RX0 中断优先级配置 * 输入 :无 * 输出 : 无 * 调用 :内部调用 */ static void CAN_NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* Enable CAN1 RX0 interrupt IRQ channel */ NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 主优先级为0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 次优先级为0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /* * 函数名:CAN_Polling * 描述 :配置 CAN 的工作模式为 回环模式 * 输入 :无 * 输出 : -PASSED 成功 * -FAILED 失败 * 调用 :内部调用 */ TestStatus CAN_Polling(void) { CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; CanTxMsg TxMessage; CanRxMsg RxMessage; uint32_t i = 0; uint8_t TransmitMailbox = 0; /* CAN register init */ CAN_DeInit(CAN1); CAN_StructInit(&CAN_InitStructure); /* CAN cell init */ CAN_InitStructure.CAN_TTCM=DISABLE; // 时间触发通信禁止 CAN_InitStructure.CAN_ABOM=DISABLE; // 离线退出是在中断置位清0后退出 CAN_InitStructure.CAN_AWUM=DISABLE; // 自动唤醒模式:清零sleep CAN_InitStructure.CAN_NART=DISABLE; // 自动重新传送豹纹,知道发送成功 CAN_InitStructure.CAN_RFLM=DISABLE; // FIFO没有锁定,新报文覆盖旧报文 CAN_InitStructure.CAN_TXFP=DISABLE; // 发送报文优先级确定:标志符 CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; // 回环模式 CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; // 1tq、BS1、BS2的值跟波特率有关 CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=5; // 分频系数为5 CAN_Init(CAN1, &CAN_InitStructure); // 初始化CAN1 /* CAN filter init */ CAN_FilterInitStructure.CAN_FilterNumber=0; CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); /* transmit */ TxMessage.StdId=0x11; // 设定标准标识符(11位,扩展的为29位) TxMessage.RTR=CAN_RTR_DATA; // 传输消息的帧类型为数据帧(还有远程帧) TxMessage.IDE=CAN_ID_STD; // 消息标志符实验标准标识符 TxMessage.DLC=2; // 发送两帧,一帧8位 TxMessage.Data[0]=0xCA; // 第一帧数据 TxMessage.Data[1]=0xFE; // 第二帧数据 TransmitMailbox=CAN_Transmit(CAN1, &TxMessage); i = 0; // 用于检查消息传输是否正常 while((CAN_TransmitStatus(CAN1, TransmitMailbox) != CANTXOK) && (i != 0xFF)) { i++; } i = 0; // 检查返回的挂号的信息数目 <span style="line-height: 21px; background-color: rgb(209, 217, 226); "> while((CAN_MessagePending(CAN1, CAN_FIFO0) |
RE:stm32的can调试时,can-tx引脚没有数据输出
环回模式可用于自测试。为了避免外部的影响,在环回模式下CAN内核忽略确认错误(在数据/远程帧的确认位时刻,不检测是否有显性位)。在环回模式下,bxCAN在内部把Tx输出回馈到Rx输入上,而完全忽略CANRX引脚的实际状态。发送的报文可以在CANTX引脚上检测到。
跟版主学习一下,最近做的项目有用CAN通讯