初级会员
- 积分
- 72
- 金钱
- 72
- 注册时间
- 2018-9-19
- 在线时间
- 48 小时
|
20金钱
最近遇到个怪现象,我STM8AF5288的板子,利用CAN接收到相应的报文后(一个报文即可),将IO口置高(初始化时为低电平)。而实际测试的时候发现,无论怎样,我IO口都没有被置高,除非我连续发送报文,IO口才会被置高。但是,如果我将IO初始化为高电平,然后接收到报文后,将IO口置低。测试的时候正常,哪怕只接收到一个报文,IO口也会被置低!! 这是为什么???? 具体程序如下:
void BSP_Configuration(void);//硬件初始化函数声明
int main(void)
{
GPIO_Init(GPIOE,GPIO_PIN_3,GPIO_MODE_OUT_PP_HIGH_FAST); //****PE3->S,can通讯芯片使能端口***//
GPIO_Init(GPIOC,GPIO_PIN_1,GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init(GPIOC,GPIO_PIN_2,GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init(GPIOC,GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init(GPIOD,GPIO_PIN_0,GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_WriteLow(GPIOE, GPIO_PIN_3);
BSP_Configuration();//硬件驱动初始化函数
while(1)
{
}
}
void BSP_Configuration(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//时钟速度为内部16M,1分频,
CAN_Configuration();//调用CAN初始化函数
rim();//打开总中断
}
void CAN_Configuration(void)
{
//初始化CAN波特率为1M
CAN_Init(CAN_MasterCtrl_AllDisabled,CAN_Mode_Normal,CAN_SynJumpWidth_1TimeQuantum,CAN_BitSeg1_11TimeQuantum,CAN_BitSeg2_4TimeQuantum,1);
//配置CAN第0组过滤器为屏蔽模式。但是屏蔽位都设置为0,所以相当于没启动屏蔽功能。
CAN_FilterInit(CAN_FilterNumber_0,ENABLE,CAN_FilterMode_IdMask,CAN_FilterScale_32Bit,0,0,0,0,0,0,0,0);
//使能CAN接收中断功能
CAN_ITConfig(CAN_IT_FMP,ENABLE);
}
/*********************************************************************************
* 函 数 名: CAN_RecvData_Demo1
* 功能说明: CAN数据转发实验例程
* 形 参:无
* 返 回 值: 无
*********************************************************************************/
void CAN_RecvData_Demo1(void)
{ GPIO_WriteHigh(GPIOD, GPIO_PIN_0);
GPIO_WriteHigh(GPIOC, GPIO_PIN_1);
GPIO_WriteHigh(GPIOC, GPIO_PIN_2);
GPIO_WriteHigh(GPIOC, GPIO_PIN_3);
u32 id;
CAN_Id_TypeDef ide;
CAN_RTR_TypeDef rtr;
u8 data[8];
u8 dlc,i;
CAN_Receive();//读取缓存中的数据
id=CAN_GetReceivedId();//读取ID号
ide=CAN_GetReceivedIDE();//读取帧类型(标准或扩展)
rtr=CAN_GetReceivedRTR();//读取帧类型(数据或远程)
dlc=CAN_GetReceivedDLC();//读取接收到的数据字节数
for(i=0;i<dlc;i++)
{
data[i]=CAN_GetReceivedData(i);//把接收到的数据送到自定义数组里
}
if((ide==CAN_Id_Standard)&&(rtr==CAN_RTR_Data)&&(dlc==8))
{
if((id!=0x212)&&(data[7]!=0x01))
{
GPIO_WriteLow(GPIOD, GPIO_PIN_0);
GPIO_WriteLow(GPIOC, GPIO_PIN_1);
GPIO_WriteLow(GPIOC, GPIO_PIN_2);
GPIO_WriteLow(GPIOC, GPIO_PIN_3);
}
}
}
|
|