软件:keil5、EmbededDebug v2.0
目的:按下按键芯片能发送给电脑。当电脑发送时,触发中断,而后芯片把收到的数据返回给电脑
以下必须有,放入主函数:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
LED_Init(); //初始化LED
KEY_Init(); //按键初始化
CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_Normal);//500K
while(1)
{
key=KEY_Scan(0);//按键扫描
if(key==KEY0_PRES)//KEY0按下,发送一次数据
{
for(i=0;i《8;i++)
{
canbuf=i;//填充发送缓冲区
}
CAN1_KeySend_Msg(canbuf,8);
}
}
使用扩展帧,不用标准帧:
u8 CAN1_KeySend_Msg(u8* msg,u8 len)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
//TxMessage.StdId=0x18; // This parameter can be a value between 0 to 0x7FF. 标准的不用了
TxMessage.ExtId=0x181056f4; // This parameter can be a value between 0 to 0x1FFFFFFF 使用扩展
//TxMessage.IDE=0;
TxMessage.IDE=1; //使用扩展置1
TxMessage.RTR=0;// 消息类型为数据帧
TxMessage.DLC=len;
for(i=0;i
TxMessage.Data=msg;
mbox= CAN_Transmit(CAN1, &TxMessage);
i=0;
while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i《0XFFF))i++;//等待发送结束
if(i》=0XFFF)return 1;
return 0;
}
最重要的就是:CAN_Transmit()
在stm32f4xx_can.c文件中
如果用例程,使用扩展帧的时候一直都失败
所以需要修改的地方如下:
assert_param(IS_CAN_EXTID(TxMessage-》ExtId));
CANx-》sTxMailBox[transmit_mailbox].TIR |= ((TxMessage-》ExtId 《《 3) |
TxMessage-》IDE《《2 |
TxMessage-》RTR《《1);
现在自己写一个结构体用来存放自己想发送的数据
typedef struct CAN_Tx{
u16 DA; //指定发送的数据
u16 DB;
u16 DC;
u16 DD;
u16 Ide;
u16 Rtr;
u16 Len; //指定字节数
u32 RevMBXnID ; //指定发送的ID号,
}TCAN_Msg;
TCAN_Msg CANTxMsg[]={{0,0,0,0, 0,0,0,0x00}};
再搞一个指针TCAN_Msg *PtrCanTx = &CANTxMsg[0];//指向结构体地址
就可以这样了:PtrCanTx-》 Len = 8;
再写一个和上面u8 CAN1_KeySend_Msg(u8* msg,u8 len)差不多的函数
就叫:u8 CAN1_Send_Msg(TCAN_Msg *CANTx)
对于中断服务函数:
在初始化的时候(用例程就行)已开启中断,所以电脑发送数据就会触发中断(FIFO0消息挂号中断允许。)
void CAN1_RX0_IRQHandler(void)
在中断中可以写一些,接收到某消息后的某动作啥的
================================================================
按键按下发送:0x01 0x02 0x03 0x04 0x05 0x06 0x07
在程序里写想发送的数据:0x01 0x00 0x00 0x00 0x00 0x00
软件:keil5、EmbededDebug v2.0
目的:按下按键芯片能发送给电脑。当电脑发送时,触发中断,而后芯片把收到的数据返回给电脑
以下必须有,放入主函数:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
LED_Init(); //初始化LED
KEY_Init(); //按键初始化
CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_7tq,6,CAN_Mode_Normal);//500K
while(1)
{
key=KEY_Scan(0);//按键扫描
if(key==KEY0_PRES)//KEY0按下,发送一次数据
{
for(i=0;i《8;i++)
{
canbuf=i;//填充发送缓冲区
}
CAN1_KeySend_Msg(canbuf,8);
}
}
使用扩展帧,不用标准帧:
u8 CAN1_KeySend_Msg(u8* msg,u8 len)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
//TxMessage.StdId=0x18; // This parameter can be a value between 0 to 0x7FF. 标准的不用了
TxMessage.ExtId=0x181056f4; // This parameter can be a value between 0 to 0x1FFFFFFF 使用扩展
//TxMessage.IDE=0;
TxMessage.IDE=1; //使用扩展置1
TxMessage.RTR=0;// 消息类型为数据帧
TxMessage.DLC=len;
for(i=0;i
TxMessage.Data=msg;
mbox= CAN_Transmit(CAN1, &TxMessage);
i=0;
while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i《0XFFF))i++;//等待发送结束
if(i》=0XFFF)return 1;
return 0;
}
最重要的就是:CAN_Transmit()
在stm32f4xx_can.c文件中
如果用例程,使用扩展帧的时候一直都失败
所以需要修改的地方如下:
assert_param(IS_CAN_EXTID(TxMessage-》ExtId));
CANx-》sTxMailBox[transmit_mailbox].TIR |= ((TxMessage-》ExtId 《《 3) |
TxMessage-》IDE《《2 |
TxMessage-》RTR《《1);
现在自己写一个结构体用来存放自己想发送的数据
typedef struct CAN_Tx{
u16 DA; //指定发送的数据
u16 DB;
u16 DC;
u16 DD;
u16 Ide;
u16 Rtr;
u16 Len; //指定字节数
u32 RevMBXnID ; //指定发送的ID号,
}TCAN_Msg;
TCAN_Msg CANTxMsg[]={{0,0,0,0, 0,0,0,0x00}};
再搞一个指针TCAN_Msg *PtrCanTx = &CANTxMsg[0];//指向结构体地址
就可以这样了:PtrCanTx-》 Len = 8;
再写一个和上面u8 CAN1_KeySend_Msg(u8* msg,u8 len)差不多的函数
就叫:u8 CAN1_Send_Msg(TCAN_Msg *CANTx)
对于中断服务函数:
在初始化的时候(用例程就行)已开启中断,所以电脑发送数据就会触发中断(FIFO0消息挂号中断允许。)
void CAN1_RX0_IRQHandler(void)
在中断中可以写一些,接收到某消息后的某动作啥的
================================================================
按键按下发送:0x01 0x02 0x03 0x04 0x05 0x06 0x07
在程序里写想发送的数据:0x01 0x00 0x00 0x00 0x00 0x00
举报