typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
__IO uint32_t CANFLAG = 0; volatile TestStatus TestRx; TestStatus CAN_Polling(void); TestStatus CAN_Interrupt(void);
//can设置初始化
void CAN_Config(void) {
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE); }
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_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
CAN_InitStructure.CAN_TTCM=DISABLE; CAN_InitStructure.CAN_ABOM=DISABLE; CAN_InitStructure.CAN_AWUM=DISABLE; CAN_InitStructure.CAN_NART=DISABLE; CAN_InitStructure.CAN_RFLM=DISABLE; CAN_InitStructure.CAN_TXFP=DISABLE;
CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=5; 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);
TxMessage.StdId=0x11;
TxMessage.RTR=CAN_RTR_DATA; TxMessage.IDE=CAN_ID_STD; TxMessage.DLC=2;
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;
while((CAN_MessagePending(CAN1, CAN_FIFO0) < 1) && (i != 0xFF)) {
i++; }
RxMessage.StdId=0x00; RxMessage.IDE=CAN_ID_STD; RxMessage.DLC=0;
RxMessage.Data[0]=0x00; RxMessage.Data[1]=0x00;
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); if (RxMessage.StdId!=0x11) {
return FAILED; }
if (RxMessage.IDE!=CAN_ID_STD) {
return FAILED; }
if (RxMessage.DLC!=2) {
return FAILED; }
if ((RxMessage.Data[0]<<8|RxMessage.Data[1])!=0xCAFE) {
return FAILED; }
return PASSED; }
TestStatus CAN_Interrupt(void) {
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure; CanTxMsg TxMessage; uint32_t i = 0;
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
CAN_InitStructure.CAN_TTCM=DISABLE; CAN_InitStructure.CAN_ABOM=DISABLE; CAN_InitStructure.CAN_AWUM=DISABLE; CAN_InitStructure.CAN_NART=DISABLE; CAN_InitStructure.CAN_RFLM=DISABLE; CAN_InitStructure.CAN_TXFP=DISABLE;
CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=1; CAN_Init(CAN1, &CAN_InitStructure);
CAN_FilterInitStructure.CAN_FilterNumber=1;
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=CAN_FIFO0; CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; CAN_FilterInit(&CAN_FilterInitStructure);
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
TxMessage.StdId=0x00; TxMessage.ExtId=0x1234; TxMessage.IDE=CAN_ID_EXT;
TxMessage.RTR=CAN_RTR_DATA; TxMessage.DLC=2;
TxMessage.Data[0]=0xDE; TxMessage.Data[1]=0xCA;
CAN_Transmit(CAN1, &TxMessage);
CANFLAG = 0xFF;
i=0;
while((CANFLAG == 0xFF) && (i < 0xFFF)) {
i++; }
if (i == 0xFFF) {
CANFLAG=0; }
CAN_ITConfig(CAN1, CAN_IT_FMP0, DISABLE); return (TestStatus)CANFLAG; }
//测试CAN
void TEST_CAN(void) {
TestRx = CAN_Polling();
if (TestRx == FAILED) {
GPIO_SetBits(GPIOB, GPIO_Pin_5); } else {
GPIO_SetBits(GPIOD, GPIO_Pin_6); }
TestRx = CAN_Interrupt();
if (TestRx == FAILED) {
GPIO_SetBits(GPIOB, GPIO_Pin_5); } else {
GPIO_SetBits(GPIOD, GPIO_Pin_3); } }
**************
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); ************************
void USB_LP_CAN1_RX0_IRQHandler(void) {
CanRxMsg RxMessage; RxMessage.StdId=0x00; RxMessage.ExtId=0x00; RxMessage.IDE=0; RxMessage.DLC=0; RxMessage.FMI=0;
RxMessage.Data[0]=0x00; RxMessage.Data[1]=0x00;
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
if((RxMessage.ExtId==0x1234) && (RxMessage.IDE==CAN_ID_EXT) && (RxMessage.DLC==2) &&
((RxMessage.Data[1]|RxMessage.Data[0]<<8)==0xDECA))
{
CANFLAG = 1; } else {
CANFLAG = 0; } }
以下为液晶显示结果
因篇幅问题不能全部显示,请点此查看更多更全内容