初级会员

- 积分
- 64
- 金钱
- 64
- 注册时间
- 2020-3-25
- 在线时间
- 9 小时
|
1金钱
最近开始做can总线,例程测试没问题,在例程基础上封装了一个发送函数,但是发送不成功,循环发送一个26字节数组,代码如下,CAN_Transmit(CAN1,&TxMessage);返回值0,1,2,4,然后就一直是4.
int main(void)
{
SystemInit(); //éèÖÃÏμí3ê±ÖóÎa72M
// KeyInit(); //°′¼ü1ü½Å3õê¼»ˉ
// LED_GPIO_Config();//LED1ü½Å3õê¼»ˉ
CAN_GPIO_Config();//CAN1ü½Å3õê¼»ˉ
CAN_NVIC_Configuration(); //CANÖD¶Ï3õê¼»ˉ
CAN_INIT();//CA3õê¼»ˉNÄ£¿é
while(1)
{
can_tx(canbuf,26);
Delay(10000);
}
}
/* CAN3õê¼»ˉ */
void CAN_INIT(void)
{
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
CanTxMsg TxMessage;
/* CAN register init */
CAN_DeInit(CAN1); //½«íaéèCANμÄè«2¿¼Ä′æÆ÷ÖØéèÎaè±ê¡Öμ
CAN_StructInit(&CAN_InitStructure);//°ÑCAN_InitStructÖDμÄÿò»¸ö2Îêy°′è±ê¡Öμìîèë
/* CAN cell init */
CAN_InitStructure.CAN_TTCM=DISABLE;//ûóDê1Äüê±¼ä′¥·¢Ä£ê½
CAN_InitStructure.CAN_ABOM=DISABLE;//ûóDê1Äü×Ô¶ˉàëÏß1üàí
CAN_InitStructure.CAN_AWUM=DISABLE;//ûóDê1Äü×Ô¶ˉ»½DÑÄ£ê½
CAN_InitStructure.CAN_NART=DISABLE;//ûóDê1Äü·Ç×Ô¶ˉÖØ′«Ä£ê½
CAN_InitStructure.CAN_RFLM=DISABLE;//ûóDê1Äü½óêÕFIFOËø¶¨Ä£ê½
CAN_InitStructure.CAN_TXFP=DISABLE;//ûóDê1Äü·¢ËíFIFOóÅÏè¼¶
CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;//CANéèÖÃÎaÕy3£Ä£ê½
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; //ÖØDÂí¬2½ìøÔ¾¿í¶è1¸öê±¼äμ¥λ
CAN_InitStructure.CAN_BS1=CAN_BS1_3tq; //ê±¼ä¶Î1Îa3¸öê±¼äμ¥λ
CAN_InitStructure.CAN_BS2=CAN_BS2_2tq; //ê±¼ä¶Î2Îa2¸öê±¼äμ¥λ
CAN_InitStructure.CAN_Prescaler=60; //ê±¼äμ¥λ3¤¶èÎa60
CAN_Init(CAN1,&CAN_InitStructure);
//2¨ìØÂêÎa£o72M/2/60(1+3+2)=0.1 ¼′100K
/* CAN filter init */
CAN_FilterInitStructure.CAN_FilterNumber=1;//Ö¸¶¨1yÂËÆ÷Îa1
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//Ö¸¶¨1yÂËÆ÷Îa±êê¶·ûÆá±ÎλÄ£ê½
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//1yÂËÆ÷λ¿íÎa32λ
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;// 1yÂËÆ÷±êê¶·ûμĸß16λÖμ
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;// 1yÂËÆ÷±êê¶·ûμÄμí16λÖμ
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//1yÂËÆ÷Æá±Î±êê¶·ûμĸß16λÖμ
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;// 1yÂËÆ÷Æá±Î±êê¶·ûμÄμí16λÖμ
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;// é趨áËÖ¸Ïò1yÂËÆ÷μÄFIFOÎa0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;// ê1Äü1yÂËÆ÷
CAN_FilterInit(&CAN_FilterInitStructure);// °′éÏÃæμÄ2Îêy3õê¼»ˉ1yÂËÆ÷
/* CAN FIFO0 message pending interrupt enable */
CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE); //ê1ÄüFIFO0ÏûÏ¢1òoÅÖD¶Ï
}
void can_tx(u8* Databuf,u16 num)
{
u16 times = 0;
u8 res = 0;
u8 i = 0;
u16 j = 0;
u8 flag = 0;
CanTxMsg TxMessage;
times = num/8;
res = num%8;
TxMessage.StdId=0x00; //±ê×¼±êê¶·ûÎa0x00
TxMessage.ExtId=0x0000; //à©Õ1±êê¶·û0x0000
TxMessage.IDE=CAN_ID_EXT;//ê1óÃà©Õ1±êê¶·û
TxMessage.RTR=CAN_RTR_DATA;//Îaêy¾YÖ¡
if(times > 0)
{
for (j = 0; j < times; j++)
{
TxMessage.DLC=8; // ÏûÏ¢μÄêy¾Y3¤¶èÎa8¸ö×Ö½ú
for (i = 0; i < 8; i++)
{
TxMessage.Data = Databuf[i+(8*j)];
}
flag=CAN_Transmit(CAN1,&TxMessage); //·¢Ëíêy¾Y
Delay(100);
}
if(res > 0)
{
TxMessage.DLC=res; // ÏûÏ¢μÄêy¾Y3¤¶èÎares¸ö×Ö½ú
for (i = 0; i < res; i++)
{
TxMessage.Data = Databuf[i+(8*j)+res];
}
CAN_Transmit(CAN1,&TxMessage); //·¢Ëíêy¾Y
}
}
else
{
TxMessage.DLC=res; // ÏûÏ¢μÄêy¾Y3¤¶èÎa8¸ö×Ö½ú
for (i = 0; i < res; i++)
{
TxMessage.Data = Databuf;
}
CAN_Transmit(CAN1,&TxMessage); //·¢Ëíêy¾Y
}
}
|
|