搜索
您的当前位置:首页正文

CAN实验

来源:易榕旅网
继做了DAC实验后,继续进行第15个实验-CAN实验,本实验 Can总线的环回测试,LED2亮----说明100k/S 的轮询方式收发正常。LED3亮----说明500k/S 的中断方式收发正常。

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; } }

以下为液晶显示结果

因篇幅问题不能全部显示,请点此查看更多更全内容

Top