新闻中心

EEPW首页>嵌入式系统>设计应用> 基于STM32的CAN总线通信程序

基于STM32的CAN总线通信程序

作者: 时间:2016-11-24 来源:网络 收藏

void USB_HP_CAN_TX_IRQHandler (void)
{
// request completed mbx 0
//邮箱0请求完成当发送完成后硬件对该位置1407
if (CAN->TSR & (1<<0))//检测是否置1来判断发送已完成
{
// reset request complete mbx 0
//复位邮箱0请求,对该位写1可以清0该位407
CAN->TSR |= 1<<0;
// disableTME interrupt

CAN->IER &= ~(1<<0);//禁止发送邮箱空中断

CAN_TxRdy = 1;
}
}

本文引用地址://m.amcfsurvey.com/article/201611/320933.htm


void USB_LP_CAN_RX0_IRQHandler (void) {
// message pending ?
//接收到CAN报文,通过判断报文数目判断是否有报文
if (CAN->RF0R & (1<<0))
{
// read the message
//接收报文
CAN_rdMsg (&CAN_RxMsg);

CAN_RxRdy = 1;// set receive flag
}
}


////////////////////////CAN初始化////////////////////////////////////////////////////////////////////////
void can_Init (void)
{

CAN_setup ();// setup CAN interface
CAN_wrFilter (33, STANDARD_FORMAT);// Enable reception of messages,filter set


//CAN_testmode(CAN_BTR_SILM | CAN_BTR_LBKM);// Loopback, Silent Mode (self-test)

//软件仿真使用环回模式
//CAN_testmode(CAN_BTR_SILM | CAN_BTR_LBKM);
//硬件仿真使用正常模式
CAN_testmode(); //正常模式
// leave init mode
//进入正常模式
CAN_start ();
// wait til mbx is empty
//等待CAN就绪
CAN_waitReady ();
}

以下是.H文件
#ifndef _CAN_H_
#define _CAN_H_

#define STANDARD_FORMAT0
#define EXTENDED_FORMAT1

#define DATA_FRAME0
#define REMOTE_FRAME1

#define CAN_ID_STD((u32)0x00000000)
#define CAN_ID_EXT((u32)0x00000004)


typedef struct{
unsigned intid;// 29 bit identifier
unsigned chardata[8];// Data field
unsigned charlen;// Length of data field in bytes
unsigned charformat;// 0 - STANDARD, 1- EXTENDED IDENTIFIER
unsigned chartype;// 0 - DATA FRAME, 1 - REMOTE FRAME
} CAN_msg;


void CAN_setup(void);
//void CAN_init(void);
void CAN_start(void);
void CAN_waitReady(void);
void CAN_wrMsg(CAN_msg *msg);
void CAN_rdMsg(CAN_msg *msg);
void CAN_wrFilter(unsigned int id, unsigned char filter_type);
void can_Init (void);
void CAN_testmode(void);

extern CAN_msgCAN_TxMsg;// CAN messge for sending
extern CAN_msgCAN_RxMsg;// CAN message for receiving
extern u8CAN_TxRdy;// CAN HW ready to transmit a message
extern u8CAN_RxRdy;// CAN HW received a message

#endif // _CAN_H_

以下是主程序部分:
int main(void)//主函数,int类型,无参数
{
u32 i=0;
Stm32_Clock_Init(9);//调用系统时钟初始化子程序
delay_init(72);//调用延时初始化子程序
IOSET_init();//调用io口初始化子程序
PWM_Init(9000,0);//定时器4初始化,设定PWM频率=72MHz/9000=8KH

can_Init ();// initialise CAN interface

// initialise message to send
for (i = 0; i < 8; i++) CAN_TxMsg.data[i] = 0;







while(1)
{
delay_us(160);


if (CAN_TxRdy)
{
if(++i==600)
{

CAN_TxMsg.id = 33;
CAN_TxMsg.len = 4;
CAN_TxMsg.format = STANDARD_FORMAT;//使用标准帧
CAN_TxMsg.type = DATA_FRAME;//数据帧


//i=0;
//下面是数据报文
CAN_TxMsg.data[0] = 1;
CAN_TxMsg.data[1] = 2;
CAN_TxMsg.data[2] =3;
CAN_TxMsg.data[3] =4;

//发送CAN报文
CAN_TxRdy = 0;
CAN_wrMsg (&CAN_TxMsg);
}
else if(i==1200)
{
i=0;
//下面是数据报文
CAN_TxMsg.data[0] = 0;
CAN_TxMsg.data[1] = 1;
CAN_TxMsg.data[2] = 1;
CAN_TxMsg.data[3] = 1;

//发送CAN报文
CAN_TxRdy = 0;
CAN_wrMsg (&CAN_TxMsg);
}

}

if (CAN_RxRdy)
{
CAN_RxRdy = 0;

if(CAN_RxMsg.data[0]==1)////PC8状态
LED1=0;
else
LED1=1;

if(CAN_RxMsg.data[1]==2)////PC9状态
LED2=0;
else
LED2=1;

if(CAN_RxMsg.data[2]==3)////PC10状态
LED3=0;
else
LED3=1;

if(CAN_RxMsg.data[3]==4)////PC11状态
LED4=0;
else
LED4=1;

}

}
}


上一页 1 2 下一页

评论


技术专区

关闭