初级会员

- 积分
- 67
- 金钱
- 67
- 注册时间
- 2014-1-24
- 在线时间
- 4 小时
|
10金钱
各位大哥大姐好,本人现在在调stm32f105 can的双机通讯,一直调不通,程序是根据原子大哥的程序来的。两块板的can配置如下:
#define CAN1_RX0_INT_ENABLE 1
void Can1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
#if CAN1_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_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //¸′óÃíÆíìêä3ö
GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸′óÃíÆíìêä3ö
GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOA.9
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);
//CANμ¥ÔaéèÖÃ
CAN_InitStructure.CAN_TTCM=DISABLE; //·Çê±¼ä′¥·¢í¨DÅÄ£ê½
CAN_InitStructure.CAN_ABOM=DISABLE; //èí¼t×Ô¶ˉàëÏß1üàí
CAN_InitStructure.CAN_AWUM=DISABLE;//ËˉÃßÄ£ê½í¨1yèí¼t»½DÑ(Çå3yCAN->MCRμÄSLEEPλ)
CAN_InitStructure.CAN_NART=ENABLE; //½ûÖ1±¨ÎÄ×Ô¶ˉ′«Ëí
CAN_InitStructure.CAN_RFLM=DISABLE; //±¨ÎÄ2»Ëø¶¨,DÂμĸ2¸Ç¾éμÄ
CAN_InitStructure.CAN_TXFP=DISABLE; //óÅÏè¼¶ó鱨Îıêê¶·û¾ö¶¨
CAN_InitStructure.CAN_Mode= CAN_Mode_Normal; //Ä£ê½éèÖÃ
// CAN_InitStructure.CAN_Mode= CAN_Mode_LoopBack; //Ä£ê½éèÖÃ
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //ÖØDÂí¬2½ìøÔ¾¿í¶è(Tsjw)Îatsjw+1¸öê±¼äμ¥λ CAN_SJW_1tq~CAN_SJW_4tq
CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; //Tbs1·¶Î§CAN_BS1_1tq ~CAN_BS1_16tq
CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;//Tbs2·¶Î§CAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler=45; //·ÖÆμÏμêy(Fdiv)Îabrp+1
CAN_Init(CAN1, &CAN_InitStructure); // 3õê¼»ˉCAN1
//ÅäÖÃ1yÂËÆ÷
CAN_FilterInitStructure.CAN_FilterNumber=0; //1yÂËÆ÷0
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32λ
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32λID
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32λMASK
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//1yÂËÆ÷01Øáaμ½FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //¼¤»î1yÂËÆ÷0
CAN_FilterInit(&CAN_FilterInitStructure);//ÂË2¨Æ÷3õê¼»ˉ
#if CAN1_RX0_INT_ENABLE
CAN_ITConfig(CAN1,CAN_IT_FMP0|CAN_IT_EPV,ENABLE);//FIFO0ÏûÏ¢1òoÅÖD¶ÏÔêDí.
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // Ö÷óÅÏè¼¶Îa1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // ′ÎóÅÏè¼¶Îa0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
#endif
return ;
}
#if CAN1_RX0_INT_ENABLE //ê1ÄüRX0ÖD¶Ï
//ÖD¶Ï·tÎñoˉêy
void CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;
int i=0;
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
// for(i=0;i<8;i++)
// printf("rxbuf[%d]:%d\r\n",i,RxMessage.Data[i]);
CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);
}
#endif
//can·¢Ëíò»×éêy¾Y(1춨¸ñê½:IDÎa0X12,±ê×¼Ö¡,êy¾YÖ¡)
//len:êy¾Y3¤¶è(×î′óÎa8)
//msg:êy¾YÖ¸Õë,×î′óÎa8¸ö×Ö½ú.
//·μ»ØÖμ:0,3é1|;
// ÆäËû,ê§°ü;
u8 CAN1_Send_Msg(u8* msg,u8 len)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
TxMessage.StdId=0x12; // ±ê×¼±êê¶·ûÎa0
//TxMessage.ExtId=0x12; // éèÖÃà©Õ1±êê¾·û£¨29룩
TxMessage.IDE=CAN_ID_STD; // ê1óÃà©Õ1±êê¶·û
TxMessage.RTR=CAN_RTR_DATA; // ÏûÏ¢ààDíÎaêy¾YÖ¡£¬ò»Ö¡8λ
TxMessage.DLC=len; // ·¢Ëíá½Ö¡DÅÏ¢
for(i=0;i<len;i++)
TxMessage.Data[i]=msg[i]; // μúò»Ö¡DÅÏ¢
mbox= CAN_Transmit(CAN1, &TxMessage);
i=0;
//while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++; //μè′y·¢Ëí½áêø
while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)); //μè′y·¢Ëí½áêø
if(i>=0XFFF)return 1;
return 0;
}
//can¿ú½óêÕêy¾Y2éÑˉ
//buf:êy¾Y»o′æÇø;
//·μ»ØÖμ:0,ÎTêy¾Y±»êÕμ½;
// ÆäËû,½óêÕμÄêy¾Y3¤¶è;
u8 CAN1_Receive_Msg(u8 *buf)
{
u32 i;
CanRxMsg RxMessage;
if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0; //ûóD½óêÕμ½êy¾Y,Ö±½óíË3ö
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//¶áè¡êy¾Y
for(i=0;i<RxMessage.DLC;i++)
buf[i]=RxMessage.Data[i];
return RxMessage.DLC;
}
发送板的主函数如下:
int main(void)
{
int i;
u8 data[8];
u8 data1[8];
// while(SysTick_Config(SystemFrequency/1000));
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÖD¶ÏóÅÏè¼¶·Ö×éÎa×é2£o2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
// uart_init(9600); //′®¿ú3õê¼»ˉÎa115200
// TIM3_Int_Init();
// Adc_Init();
// fm24cl_Init();
// EXTIX_Init();
// LED_Init();
Can1_Init();
while(1)
{
for(i=0;i<8;i++)
data[i]=i+1;
i=CAN1_Send_Msg(data,8);
if(i)
i=0;
// i=CAN1_Receive_Msg(data1);
// if(i)
// i=0;
delay_ms(10000);
}
}
接收板的主函数如下:
int main(void)
{
int i;
u8 data[8];
u8 data1[8];
// while(SysTick_Config(SystemFrequency/1000));
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÖD¶ÏóÅÏè¼¶·Ö×éÎa×é2£o2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
// uart_init(9600); //′®¿ú3õê¼»ˉÎa115200
// TIM3_Int_Init();
// Adc_Init();
// fm24cl_Init();
// EXTIX_Init();
// LED_Init();
Can1_Init();
while(1)
{
// printf("%d",1);
// for(i=0;i<8;i++)
// data[i]=i+1;
// i=CAN1_Send_Msg(data,8);
// if(i)
i=CAN1_Receive_Msg(data1);
if(i)
i=0;
// delay_ms(100);
}
}
有一段时间内,接收板用查询的方式能够接受到发送版发送过来的信息,但是中断接受不到。然后如果把接收板改成发送板,发送板为接收板,则接受不到。
但是某一次修改程序的时候,把接收板主函数里的if(i) i=0;改成if(i) i--;就接收不到了。然后重新改回去,还是接收不到。
在硬件部分,接收板与发送板的rx与tx端都有接指示灯。发送的时候,两块板的指示灯都会亮。
现在不知道问题出在哪里。希望各位大哥大姐给出自己的意见。
|
|