新手入门
- 积分
- 11
- 金钱
- 11
- 注册时间
- 2016-2-3
- 在线时间
- 2 小时
|
1金钱
我在弄can的实验得到的时序图有这样两个 can0 是从机的tx can1是从机的rx can2是主机的tx can3是主机的rx
请问有人遇到这样的情况吗?
我的代码是这样的:
#include "bsp_can.h"
//#include "usart.h"
//#include "lcd.h"
/**
@breaf BSP_CAN_Lib can总线驱动库
*/
static void bsp_can_io_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ENABLE RCC_APB2 Reageister GPIOA
/* Configure CAN pin: RX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_CAN_RX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIO_CAN, &GPIO_InitStructure);
/* Configure CAN pin: TX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_CAN_TX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_CAN, &GPIO_InitStructure);
}
static void bsp_can_mode_config(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
RCC->APB1ENR|=1<<25; //ENABLE RCC_APB1 Reageister can
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
/* CAN cell init */
CAN_InitStructure.CAN_TTCM = DISABLE; //CAN时间触发模式
CAN_InitStructure.CAN_ABOM = ENABLE; //自动离线管理
CAN_InitStructure.CAN_AWUM = ENABLE; //自动离线唤醒
CAN_InitStructure.CAN_NART = DISABLE; //禁止报文自动重传 失能
CAN_InitStructure.CAN_RFLM = DISABLE; //接收FIFO是否锁定 非锁定模式,溢出后新的覆盖旧的
CAN_InitStructure.CAN_TXFP = DISABLE; //报文优先级的判定方法
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //正常工作模式 CAN_Mode_LoopBack
/* CAN Baudrate = 0.8 MBps*/
CAN_InitStructure.CAN_SJW = CAN_SJW_2tq; //重新同步跳跃宽度
CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq;
CAN_InitStructure.CAN_Prescaler = 4;
CAN_Init(CAN1, &CAN_InitStructure);
//滤波器的设置
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);
}
static void bsp_can_nvic_config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
//NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void bsp_can_init(void)
{
bsp_can_io_config(); //初始化CAN的引脚
bsp_can_nvic_config(); //中断向量的配置
bsp_can_mode_config(); //
}
void bsp_can_SendData(u8 *text,u8 len)
{
u8 i=0;
CanTxMsg TxMessage;
TxMessage.StdId = MyStdID; //自定义宏 扩展的时候修改
TxMessage.ExtId = 0x0;
TxMessage.IDE = CAN_Id_Standard;
TxMessage.RTR = CAN_RTR_Data;
TxMessage.DLC = len;
for(;i<len;i++){
TxMessage.Data[i]=text[i];
}
CAN_Transmit(CAN1,&TxMessage);
}
extern __IO u8 CAN_RxBuffer[255]; //CAN接收报文缓存区
extern __IO u8 CAN_Low,CAN_High; //CAN队列指针
CanRxMsg RxMessage;
void CAN1_RRxMessageX0_IRQHandler(void)
{
CAN_Receive(CAN1, CAN_FIFO0,&RxMessage);
if(RxMessage.RTR==CAN_RTR_DATA){
switch(RxMessage.StdId){
case 0x1311:
CAN_RxBuffer[CAN_High] = 1;//该控制器节点
CAN_High++;
break;
case 0x1312: //该控制器以后的节点
CAN_RxBuffer[CAN_High] = 0;
CAN_High++;
break;
default:
break;
}
}
}
|
-
-
|