#include"stm32f10x_lib.h"
void CAN_configure(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);
/* CAN1 Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
/*can register int*/
CAN_DeInit();
/*can cell init*/
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=18;
CAN_Init(&CAN_InitStructure);
/* 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=((u32)0x0020<<21)>>16;//标识符
CAN_FilterInitStructure.CAN_FilterIdLow=(((u32)0x0020<<21)|CAN_ID_STD|CAN_RTR_DATA);//&0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xffff;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
/* Configure CAN pin: RX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure CAN pin: TX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* CAN Periph clock enable */
}
void can_send(unsigned char data)
{
CanTxMsg TxMessage;
u8 TransmitMailbox = 0;
TxMessage.StdId=0x0020;//标识符
TxMessage.RTR=CAN_RTR_DATA;
TxMessage.IDE=CAN_ID_STD;
TxMessage.DLC=2;
TxMessage.Data[0]=data;
TxMessage.Data[1]=0xFE;
TransmitMailbox=CAN_Transmit(&TxMessage);
while(CAN_TransmitStatus(TransmitMailbox) != CANTXOK){}//等待发送
}
unsigned char can_rev(void)
{
CanRxMsg RxMessage;
// RxMessage.StdId=0x00;//不需要设置
RxMessage.IDE=CAN_ID_STD;
RxMessage.DLC=2;
RxMessage.Data[0]=0x00;
RxMessage.Data[1]=0x00;
while (CAN_MessagePending(CAN_FIFO0)==0);//等到接收
CAN_Receive(CAN_FIFO0, &RxMessage);
CAN_FIFORelease(CAN_FIFO0);
return RxMessage.Data[0];
}
-------------------------------------
main()
{
unsigned int a;
RCC_Configuration();
/*初始化 GPIOC时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
USART_Configuration();
CAN_configure();
LedInit();
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_7);
Delay(10);
GPIO_ResetBits(GPIOB,GPIO_Pin_7);
Delay(10);
can_send(0x54);
a=can_rev();
USART1_Putc(a);
}
}
|