初级会员

- 积分
- 105
- 金钱
- 105
- 注册时间
- 2017-8-4
- 在线时间
- 48 小时
|
1金钱
以下是CAN配置的代码
void CAN_Configuration(void)
{
u16 temp;
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
printf("Can Configuration\r\n");
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//ê1ÄüPORTAê±Öó
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//ê1ÄüCAN1ê±Öó
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); //3õê¼»ˉIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //éÏà-êäèë
GPIO_Init(GPIOA, &GPIO_InitStructure); //3õê¼»ˉIO
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;//ÔêDí×Ô¶ˉÖØ′«
CAN_InitStructure.CAN_RFLM=DISABLE;
CAN_InitStructure.CAN_TXFP=DISABLE;
CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CAN_Mode_LoopBack;//CAN_Mode_Normal; //32M/8/20 = 200K
CAN_InitStructure.CAN_SJW=CAN_SJW_2tq;
CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
CAN_InitStructure.CAN_Prescaler=8;
CAN_Init(CAN1,&CAN_InitStructure);
temp = 0;
temp |= CAN_SELF_ADDRESS;
temp <<= 8;
temp |= DET_SOURCE_ADDRESS;
/* 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=temp ;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0004; //μúèyλÎa1 ±íê¾Ö» ½óêÕà©Õ1Ö¡
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xffff; ////1 ±ØDëÆ¥Åä 0 2»1ØDÄ 0xfff0
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0004;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
/* CAN FIFO0 message pending interrupt enable */
CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);
CAN_ITConfig(CAN1,CAN_IT_TME, ENABLE);
CAN_ITConfig(CAN1,CAN_IT_BOF, ENABLE);//àëÏßÖD¶ÏÔêDí
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // Ö÷óÅÏè¼¶Îa1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // ′ÎóÅÏè¼¶Îa0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//数据发送函数
void Can_Send_Msg(u8* msg,u8 len)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
TxMessage.StdId=0x12; // ±ê×¼±êê¶·û
TxMessage.ExtId=0x12; // éèÖÃà©Õ1±êê¾·û
TxMessage.IDE=CAN_Id_Standard; // ±ê×¼Ö¡
TxMessage.RTR=CAN_RTR_Data; // êy¾YÖ¡
TxMessage.DLC=len; // òa·¢ËíμÄêy¾Y3¤¶è
for(i=0;i<len;i++)
TxMessage.Data[i]=msg[i];
mbox= CAN_Transmit(CAN1, &TxMessage);
i=0;
while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++; //μè′y·¢Ëí½áêø
printf("finish send can data\r\n");
}
//主函数
int main(void)
{
u32 i;
u8 m = 0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÖD¶ÏóÅÏè¼¶·Ö×éÎa×é2£o2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
LED_INIT(); //3õê¼»ˉóëLEDᬽóμÄó2¼t½ó¿ú
uart_init(9600);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
CAN_Configuration();
CAN_Internal_Buffer[0] = 0xDD;
CAN_Internal_Buffer[1] = 0xDD;
GPIO_SetBits(GPIOC,GPIO_Pin_8);
printf("Restart\r\n");
while(1)
{
for(i=0;i<1000000;i++)
{
}
if(m == 0)
{
GPIO_SetBits(GPIOC,GPIO_Pin_7);
m = 1;
}
else
{
GPIO_ResetBits(GPIOC,GPIO_Pin_7);
m = 0;
}
Can_Send_Msg(CAN_Internal_Buffer,2);
}
}
程序能正常运行到CAN发送函数,但用USBCAN调试助手监测,并没有看到CAN发出的数据是怎么回事?难道是CAN配置哪里出了问题?
|
|