初级会员

- 积分
- 65
- 金钱
- 65
- 注册时间
- 2016-4-28
- 在线时间
- 16 小时
|
6金钱
1、最近想使用can通讯,于是买了tja1050模块、can分析仪(can转USB)配合mini开发板(stm32f103rct6)。接线是mini开发板的引脚(PA11\12 或PB8\9)接can模块,然后接can转USB接电脑,运行的结果是开发板可以收到pc发的数据,可是pc收不到开发板的数据。将开发板的can初始化设成回环模式收发正常。求解??2、我做了一块pcb板,can通讯一直没反应。接线也是stm3f103rct6的两个引脚接tja1050模块再接can分析仪(can转USB)接电脑,跟上面的开发板一样的接法,程序也一样,但就是收不到数据。改成回环模式收发正常。我的板子需要接收其他设备发来的can数据,,求解???
下面是程序的can配置:
u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
#if CAN_RX0_INT_ENABLE
NVIC_InitTypeDef NVIC_InitStructure;
#endif
CAN_DeInit(CAN1);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//ê1ÄüPORTAê±Öó
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//ê1ÄüCAN1ê±Öó
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap1_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); //3õê¼»ˉIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO_Mode_IPU;//éÏà-êäèë
GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸′óÃíÆíì
GPIO_Init(GPIOB, &GPIO_InitStructure); //3õê¼»ˉIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO_Mode_IPU;//éÏà-êäèë
GPIO_Init(GPIOB, &GPIO_InitStructure);//3õê¼»ˉIO
//CANμ¥ÔaéèÖÃ
CAN_InitStructure.CAN_TTCM=DISABLE; //·Çê±¼ä′¥·¢í¨DÅÄ£ê½ //
CAN_InitStructure.CAN_ABOM=ENABLE; //èí¼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= mode; //Ä£ê½éèÖão mode:0,ÆÕí¨Ä£ê½;1,»Ø»·Ä£ê½; //
//éèÖÃ2¨ìØÂê
CAN_InitStructure.CAN_SJW=tsjw; //ÖØDÂí¬2½ìøÔ¾¿í¶è(Tsjw)Îatsjw+1¸öê±¼äμ¥λ CAN_SJW_1tq CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
CAN_InitStructure.CAN_BS1=tbs1; //Tbs1=tbs1+1¸öê±¼äμ¥λCAN_BS1_1tq ~CAN_BS1_16tq
CAN_InitStructure.CAN_BS2=tbs2;//Tbs2=tbs2+1¸öê±¼äμ¥λCAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler=brp; //·ÖÆμÏμêy(Fdiv)Îabrp+1 //
CAN_Init(CAN1, &CAN_InitStructure); // 3õê¼»ˉCAN1
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 CAN_RX0_INT_ENABLE
CAN_ITConfig(CAN1,CAN_IT_FMP0,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 0;
}
#if CAN_RX0_INT_ENABLE //ê1ÄüRX0ÖD¶Ï (êμ¼êÎ′ê1Äü,¸Ãoˉêy2»Ö′DD)
//ÖD¶Ï·tÎñoˉêy
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessage;
CanTxMsg TxMessage;
RxMessage.StdId = 0x00;
RxMessage.ExtId = 0x00;
RxMessage.IDE = 0;
RxMessage.DLC = 0;
RxMessage.FMI = 0;
memset(HMC_BUF,0,8);
CAN_Receive(CAN1,CAN_FIFO0, &RxMessage);
//if(RxMessage.StdId == Parameters.FSensor_Address) //Forward Sensor
/*----------------------------------------------------------------------------*/
if(RxMessage.DLC>0)
{
HMC_BUF[0] = RxMessage.Data[0]; //0 - 7 ,??8?Byte
HMC_BUF[1] = RxMessage.Data[1];
HMC_BUF[2] = RxMessage.Data[2];
HMC_BUF[3] = RxMessage.Data[3];
HMC_BUF[4] = RxMessage.Data[4];
HMC_BUF[5] = RxMessage.Data[5];
HMC_BUF[6] = RxMessage.Data[6];
HMC_BUF[7] = RxMessage.Data[7];
}
/*----------------------------------------------------------------------------*/
}
#endif
//can·¢Ëíò»×éêy¾Y(1춨¸ñê½:IDÎa0X12,±ê×¼Ö¡,êy¾YÖ¡)
//len:êy¾Y3¤¶è(×î′óÎa8)
//msg:êy¾YÖ¸Õë,×î′óÎa8¸ö×Ö½ú.
//·μ»ØÖμ:0,3é1|;
// ÆäËû,ê§°ü;
u8 Can_Send_Msg(u8* msg,u8 len)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
TxMessage.StdId=0x000; // ±ê×¼±êê¶·û
TxMessage.ExtId=0x00000000; // éèÖÃà©Õ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·¢Ëí½áêø
if(i>=0XFFF)return 1;
return 0;
}
//can¿ú½óêÕêy¾Y2éÑˉ
//buf:êy¾Y»o′æÇø;
//·μ»ØÖμ:0,ÎTêy¾Y±»êÕμ½;
// ÆäËû,½óêÕμÄêy¾Y3¤¶è;
u8 Can_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<8;i++)
buf[i]=RxMessage.Data[i];
return RxMessage.DLC;
}
下面是主程序:
int a,b;
void Delay(u32 count)
{
u32 i=0;
for(;i<count;i++);
}
int main(void)
{ u8 msg[3]={0,0,1};
u8 buf2[8]={0,0,0};
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(9600,9600,115200);
TIM2_Int_Init(20,1799); //10ms;
CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_3tq,CAN_BS1_2tq,24,CAN_Mode_Normal);//250Kbps
G_GPIO_Init();
Dac_Init();
Dac1_Set_Vol(0);
Dac2_Set_Vol(0);
G_AGV_Init();
while(1)
{
// a= Can_Send_Msg(msg,3);
delay_ms(20);
b= Can_Receive_Msg(buf2);
// G_AVOIDANCE();
// G_MENUCHECK();
// G_EXECUTE();
}
}
一开始我使用的是PA11/12,我都板子没反应,mini开发板可接收,发送不成功;后来映射到PB8、9,我的板子仍然没反应,minimini开发板可接收,发送不成功。
第一次发帖,求大神指教。
|
-
stm32f103的图
最佳答案
查看完整内容[请看2#楼]
已解决。can是时钟频率不对。我芯片没有外接晶振,所以程序启动内部晶振,系统时钟和外设时钟频率都变了,而我之前还是用接了外部晶振的时钟计算can的波特率什么的,所以已知搞不出来。
|