我使用的是战舰的历程进行修改后的程序。板子上带了TJA1050,TXD---PA12 RXD---PA11.
[mw_shl_code=c,true]int main(void)
{
delay_init();
//Nokia5110
GPIO_Configuration();
LCD_Init();
LCD_BL_ON();
LCD_Clear();
LCD_WriteEnglishSring(8,0,"Conditioner");
LCD_WriteEnglishSring(40,1,"2015-07");
LCD_WriteEnglishSring(0,2,"Tem:");
LCD_WriteEnglishSring(0,3,"Hum:");
LCD_WriteEnglishSring(50,2,"'C");
LCD_WriteEnglishSring(50,3,"%");
CAN_DeInit(CAN1);
CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_7tq,5,CAN_Mode_Normal);//CAN_Mode_LoopBacK
while(1)
{
for(i=0;i<8;i++)
{
canbuf=i*2;
}
res=Can_Send_Msg(canbuf,8);
if(!res) GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);
key=Can_Receive_Msg(buf);
}
}[/mw_shl_code]
[mw_shl_code=c,true]uint8_t CAN_Mode_Init(uint8_t tsjw,uint8_t tbs2,uint8_t tbs1,u16 brp,uint8_t mode)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
#if CAN_RX0_INT_ENABLE
NVIC_InitTypeDef NVIC_InitStructure;
#endif
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
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);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_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= mode;
CAN_InitStructure.CAN_SJW=tsjw;
CAN_InitStructure.CAN_BS1=tbs1;
CAN_InitStructure.CAN_BS2=tbs2;
CAN_InitStructure.CAN_Prescaler=brp;
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=CAN_FilterFIFO0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
#if CAN_RX0_INT_ENABLE
CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
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);
#endif
return 0;
}
#if CAN_RX0_INT_ENABLE
void USB_LP_CAN1_RX0_IRQnHandler(void)
{
CanRxMsg RxMessage;
CAN_Receive(CAN1, 0, &RxMessage);
//for(uint8_t i=0;i<8;i++)
LCD_WriteEnglishSring(20,4,"succeed!");
}
#endif
uint8_t Can_Send_Msg(uint8_t* msg,uint8_t len)
{
uint8_t mbox;
u16 i=0;
CanTxMsg TxMessage;
TxMessage.StdId=0x1BC;
TxMessage.ExtId=0x12;
TxMessage.IDE=0;
TxMessage.RTR=0;
TxMessage.DLC=len;
for(i=0;i<len;i++)
TxMessage.Data=msg;
mbox= CAN_Transmit(CAN1, &TxMessage);
i=0;
while((CAN_TransmitStatus(CAN1, mbox)==CANTXFAILED)&&(i<0XFFF))i++;
if(i>=0XFFF)return 1;
return 0;
}
uint8_t Can_Receive_Msg(uint8_t *buf)
{
uint32_t i;
CanRxMsg RxMessage;
if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0;
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
for(i=0;i<8;i++)
buf=RxMessage.Data;
return RxMessage.DLC;
}
[/mw_shl_code]
#define CAN_RX0_INT_ENABLE 1 已经置为一,但是程序无法进中断,接收邮箱数据无,发送邮箱数据正常。
[mw_shl_code=c,true]if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0; 始终只能执行到这里,无中断产生,希望得到指点。谢谢 [/mw_shl_code]
|