这两个星期做CAN总线,实在是搞不定了,希望求助各位大神帮忙看一下,can无法进入接收中断,另一块单片机是循环发数据的,原本不用中断时是可以接收到的,但是现在想用中断来接收,不知道是不是中断配置的问题
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "can.h"
extern _ARMABI int rand(void);
uint8_t CAN_DATA0,CAN_DATA1,CAN_DATA2,CAN_DATA3,CAN_DATA4,CAN_DATA5,CAN_DATA6,CAN_DATA7;
uint16_t CAN_ID;
u8 CanFlag,Display;
u8 buf[50]={0};
//——————————————————————————————————————————————————————————————————————————————————————————————————
void USB_LP_CAN1_RX0_IRQHandler(void);
void CanWriteData(uint16_t ID);
void NVIC_Configuration(void);
void GPIO_Configuration(void);
void CAN_Configuration(void);
//——————————————————————————————————————————————————————————————————————————————————————————————————
unsigned char name[]={0xD1,0xEE,0xB0,0xB2,0xCA,0xA5};
int main(void){
// u8 key;
// u8 i;
// u8 canbuf[50]={0};
// u8 res;
delay_init(); //延时函数初始化
uart_init(115200); //串口初始化为9600
LED_Init(); //初始化与LED连接的硬件接口
//KEY_Init(); //按键初始化
//CAN1_Init();
NVIC_Configuration();
GPIO_Configuration();
CAN_Configuration();
while(1){
if(CanFlag == 1){
printf("
已进入接收中断服务函数
");
LED0=!LED0;
CanFlag = DISABLE;
printf("CAN Receive Data
");
printf("CAN ID %x
",CAN_ID);
printf("CAN_DATA0 %x
",CAN_DATA0);
printf("CAN_DATA1 %x
",CAN_DATA1);
printf("CAN_DATA2 %x
",CAN_DATA2);
printf("CAN_DATA3 %x
",CAN_DATA3);
printf("CAN_DATA4 %x
",CAN_DATA4);
printf("CAN_DATA5 %x
",CAN_DATA5);
printf("CAN_DATA6 %x
",CAN_DATA6);
printf("CAN_DATA7 %x
",CAN_DATA7);
//res=Can_Receive_Msg(canbuf);
delay_ms(1);
CAN_FIFORelease(CAN1,CAN_FIFO0);//释放FIFO0
//MyPrintfArray(canbuf,res);
LED0=!LED0; //if(res)
delay_ms(10);
}
}
}
//——————————————————————————————————————接收中断服务函数————————————————————————————————————————
/*void USB_LP_CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessage; //定义CAN接收消息结构体
NVIC_DisableIRQ(USB_LP_CAN1_RX0_IRQn); //使能CAN1消息接收中断
CAN_Receive(CAN1,0, &RxMessage); //将FIFO0中接收数据信息存入消息结构体中 CAN_FIFO0 // 此函数包含释放提出报文了的,在非必要时,不需要自己释放
//CAN_ID=RxMessage.StdId;
//CAN_ID=RxMessage.ExtId;
//if(RxMessage.Data[0]==0aRxMessage.Data[1]==01){
CAN_DATA0=RxMessage.Data[0];
CAN_DATA1=RxMessage.Data[1];
CAN_DATA2=RxMessage.Data[2];
CAN_DATA3=RxMessage.Data[3];
CAN_DATA4=RxMessage.Data[4];
CAN_DATA5=RxMessage.Data[5];
CAN_DATA6=RxMessage.Data[6];
CAN_DATA7=RxMessage.Data[7];
printf("
接收中断服务函数
");
CanFlag = 1;
}*/
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;
int i=0;
CAN_Receive(CAN1, 0, &RxMessage);
for(i=0;i<8;i++)
buf[i]=RxMessage.Data[i]; //
//return RxMessage.DLC; //
//printf("rxbuf[%d]:%d
",i,RxMessage.Data[i]);
printf("
接收中断服务函数
");
CanFlag = 1;
}
void CanWriteData(uint16_t ID)
{
CanTxMsg TxMessage;
CAN_DATA0=rand()%0xff; CAN_DATA1=rand()%0xff;
CAN_DATA2=rand()%0xff; CAN_DATA3=rand()%0xff;
CAN_DATA4=rand()%0xff; CAN_DATA5=rand()%0xff;
CAN_DATA6=rand()%0xff; CAN_DATA7=rand()%0xff;
/* transmit */
TxMessage.StdId = ID; /* 设置标准id 注意标准id的最高7位不能全是隐性(1)。共11位 */
//TxMessage.ExtId = 0x00; //设置扩展id 扩展id共18位
TxMessage.RTR = CAN_RTR_DATA; /* 设置为数据帧 */
TxMessage.IDE = CAN_ID_STD; /* 使用标准id */
TxMessage.DLC = 8; /* 数据长度, can报文规定最大的数据长度为8字节 */
TxMessage.Data[0] = CAN_DATA0;
TxMessage.Data[1] = CAN_DATA1;
TxMessage.Data[2] = CAN_DATA2;
TxMessage.Data[3] = CAN_DATA3;
TxMessage.Data[4] = CAN_DATA4;
TxMessage.Data[5] = CAN_DATA5;
TxMessage.Data[6] = CAN_DATA6;
TxMessage.Data[7] = CAN_DATA7;
CAN_Transmit(CAN1,&TxMessage); /* 返回这个信息请求发送的邮箱号0,1,2或没有邮箱申请发送no_box */
}
void 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;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* CAN Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO ,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟
GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE);
/* Configure CAN pin: RX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化IO
}
void CAN_Configuration(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
NVIC_Configuration();
GPIO_Configuration();
/* CAN register init */
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
CAN_InitStructure.CAN_TTCM=DISABLE; //非时间触发通信模式 //
CAN_InitStructure.CAN_ABOM=DISABLE; //软件自动离线管理 //
CAN_InitStructure.CAN_AWUM=DISABLE; //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)//
CAN_InitStructure.CAN_NART=ENABLE; //禁止报文自动传送 //
CAN_InitStructure.CAN_RFLM=DISABLE; //报文不锁定,新的覆盖旧的 //
CAN_InitStructure.CAN_TXFP=DISABLE; //优先级由报文标识符决定
CAN_InitStructure.CAN_Mode=CAN_Mode_Normal; //CAN设置为正常模式
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //重新同步跳跃宽度1个时间单位
CAN_InitStructure.CAN_BS1=CAN_BS1_3tq; //时间段1为3个时间单位
CAN_InitStructure.CAN_BS2=CAN_BS2_2tq; //时间段2为2个时间单位
CAN_InitStructure.CAN_Prescaler=60; //时间单位长度为60
CAN_Init(CAN1,&CAN_InitStructure); //波特率为:72M/2/60(1+3+2)=0.1 即波特率为100KBPs
//配置过滤器
CAN_FilterInitStructure.CAN_FilterNumber=0; //过滤器0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; /* 屏敝模式 */
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32位ID
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活过滤器0
CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许.
CAN_ITConfig(CAN1, CAN_IT_FMP1, ENABLE);
CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);
CAN_ITConfig(CAN2, CAN_IT_FMP1, ENABLE);
}
还有CAN1_RX1你使能了,中段函数没写
中断函数内不清除标志位?
一周热门 更多>