在线时间2 小时
UID197725
ST金币6
蝴蝶豆0
注册时间2017-12-16
该用户从未签到
新手上路
- 最后登录
- 2019-1-19
|
求助!!!!!!我用STM8S208C8做的程序,烧录以后接收不到报文,MCU的TX脚也一直为高。
如果在CAN总线上接入另外一个USBCAN, 调试的时候就可以进入接收中断了,但是发送还是不成功,而且用示波器看MCU的TX脚还是一直为高电平,有大佬知道是因为什么吗~~~
以下为初始化代码:
void CAN_Config(void)
{
CAN_InitStatus_TypeDef status = CAN_InitStatus_Failed;
/* Filter Parameters */
CAN_FilterNumber_TypeDef CAN_FilterNumber;
FunctionalState CAN_FilterActivation;
CAN_FilterMode_TypeDef CAN_FilterMode;
CAN_FilterScale_TypeDef CAN_FilterScale;
uint8_t CAN_FilterID1;
uint8_t CAN_FilterID2;
uint8_t CAN_FilterID3;
uint8_t CAN_FilterID4;
uint8_t CAN_FilterIDMask1;
uint8_t CAN_FilterIDMask2;
uint8_t CAN_FilterIDMask3;
uint8_t CAN_FilterIDMask4;
/* Init Parameters*/
CAN_MasterCtrl_TypeDef CAN_MasterCtrl;
CAN_Mode_TypeDef CAN_Mode;
CAN_SynJumpWidth_TypeDef CAN_SynJumpWidth;
CAN_BitSeg1_TypeDef CAN_BitSeg1;
CAN_BitSeg2_TypeDef CAN_BitSeg2;
uint8_t CAN_Prescaler;
/* CAN register init */
CAN_DeInit();
/* CAN filter init */
CAN_FilterNumber = CAN_FilterNumber_0;
CAN_FilterActivation = ENABLE;
CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterScale = CAN_FilterScale_32Bit;
CAN_FilterID1=0;
CAN_FilterID2=0;
CAN_FilterID3=0;
CAN_FilterID4=0;
CAN_FilterIDMask1=0;
CAN_FilterIDMask2=0;
CAN_FilterIDMask3=0;
CAN_FilterIDMask4=0;
CAN_FilterInit(CAN_FilterNumber, CAN_FilterActivation, CAN_FilterMode,\
CAN_FilterScale,CAN_FilterID1, CAN_FilterID2, CAN_FilterID3,\
CAN_FilterID4,CAN_FilterIDMask1, CAN_FilterIDMask2,\
CAN_FilterIDMask3, CAN_FilterIDMask4);
/* CAN init */
CAN_MasterCtrl=CAN_MasterCtrl_AllDisabled;
CAN_Mode = CAN_Mode_Normal;
CAN_SynJumpWidth = CAN_SynJumpWidth_1TimeQuantum;
CAN_BitSeg1 = CAN_BitSeg1_12TimeQuantum;
CAN_BitSeg2 = CAN_BitSeg2_3TimeQuantum;
CAN_Prescaler = 2;
status = CAN_Init(CAN_MasterCtrl, CAN_Mode, CAN_SynJumpWidth, CAN_BitSeg1, \
CAN_BitSeg2, CAN_Prescaler);
/* Enable Fifo message pending interrupt*/
/* Message reception is done by CAN_RX ISR*/
CAN_ITConfig(CAN_IT_FMP, ENABLE);
}
/***************************************************************************//**
* @brief 外设初始化函数.
* @return 无.
* @param 无.
* @warning 该函数将在进入主循环之前调用.
* *************************************************************************** */
static void AppL_PeriphInit(void)
{
/*GPIO Init*/
GPIO_DeInit(GPIOE);
GPIO_DeInit(GPIOD);
GPIO_Init(GPIOD,GPIO_PIN_4,GPIO_MODE_OUT_PP_LOW_SLOW);/*Voice_Mute*/
GPIO_Init(GPIOE,GPIO_PIN_2,GPIO_MODE_OUT_PP_LOW_SLOW);/*Voice_PWM2*/
GPIO_Init(GPIOE,GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_SLOW);/*STB*/
GPIO_Init(GPIOD,GPIO_PIN_2,GPIO_MODE_OUT_PP_LOW_SLOW);/*LED*/
/*Clock module init*/
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
/*Can Controller Init*/
CAN_Config();
}
/***************************************************************************//**
* @brief CAN接收中断函数.
* @return 无.
* @param 无.
* @warning 中断函数.
* *************************************************************************** */
@far @interrupt void CAN_RX_IRQ(void)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
/* Receiver Receives Frame */
uint32_t liId = 0;
CAN_Id_TypeDef ide;
CAN_RTR_TypeDef rtr;
uint8_t data[8];
uint8_t dlc,i,j;
CAN_Receive();//读取缓存中的数据
giTest = CAN_GetReceivedData(0);
liId = CAN_GetReceivedId(); //读取帧ID
ide = CAN_GetReceivedIDE();//读取帧类型(标准或扩展)
rtr = CAN_GetReceivedRTR();//读取帧类型(数据或远程)
dlc = CAN_GetReceivedDLC();//读取接收到的数据字节数
for(j=0;j<NUMBER_CAN_MSG;j++)
{
if((liId == guCanMsgBuffer[j].Id) && (dlc == guCanMsgBuffer[j].Length))
{
for(i=0;i<dlc;i++)
{
guCanMsgBuffer[j].Data[i] = CAN_GetReceivedData(i);
}
guCanMsgBuffer[j].UpdatedFlag = 1;
}
}
}
|
|