在线时间0 小时
UID79207
ST金币0
蝴蝶豆0
注册时间2008-10-2
新手上路
- 最后登录
- 1970-1-1
|
a0a.1 0b0c
<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) |
|