📄 usb_can.c
字号:
//CAN初始化---------------------------------------
#include <C8051F120.h>
#include <intrins.h>
//CAN启动------------------------
void start_CAN(void)
{ SFPRAGE=CAN0_PAGE //指向CAN0页面
CAN0CN|=0x41 //将CCE和Init置“1”开始初始化
CAN0ADR=BITREG //指向位定时寄存器进行配置
CAN0DAT=0x2301 //位率为500k/s
CAN0CN|=0x06 //允许全局中断,IE和SIE置位
CAN0CN&=0x41 } //清楚CCE和INIT位,启动CAN状态机制
void transmit_message(char MsgNum)
{ SFRPAGE=CAN0_PAGE //指向CAN0页面
CAN0ADR=IF1CMDMSK //向IF1命令屏蔽寄存器写入命令
CAN0DAT=0X0083;CAN0ADR=IF1ARB2 //指向IF1仲裁寄存器
CAN0DATH|=0x80;CAN0ADR=IF1DATA1 //指向数据场的第一个字节
for(i=0;i<4;i++)
{CAN0DAT=can_temp[i] } //将4字节数据写入发送缓冲器
CAN0ADR=IF1CMDRQST;
CAN0DATL=MsgNum //将报文对象编号写入,则数据发送到对应的报文对象中
}
void receive_data(void)
{ SFPRAGE=CAN0_PAGE //指向CAN0页面*/
CAN0ADR=IF2CMDMSK //向IF2命令屏蔽寄存器写命令
CAN0DAT=0x003F;
CAN0ADR=IF2CMDRQST //将报文对象编号写入命令请求寄存器,对应地接收
CAN0DATL=MsgNum //得到数据就从报文RAM中移到数据缓冲器中
CAN0ADR=IF2DATA1 //指向数据场的第一个字节
for(i=0;i<4;i++) //读取4个字节数据*/
{CAN_RX[i]=CAN0DAT}
}
void main(void)
{
// disable watchdog timer
WDTCN = 0xde;
WDTCN = 0xad; //禁止看殴梅
SFRPAGE = CONFIG_PAGE; // 转到配置页面 配置振荡器
external_osc (); //初始化晶振
SFRPAGE = CONFIG_PAGE; // 转到配置页面
PORT_Init ();
Timer3_Init (SYSCLK / 12 /(2*pwmfrq));
SFRPAGE = TMR3_PAGE; // 转到定时器3
pwmfrq = 40;
count = SYSCLK / 12 /(2*pwmfrq)/4;
EA = 1; // 启动中断使能
SFRPAGE = LEGACY_PAGE; // Page to sit in for now
void start_CAN();
while (1) { // 循环
}
}
void external_osc (void)
{
int n; // 循环延时局部变量
OSCXCN = 0x67; // 启动外部振荡器; 22.1184 MHz 晶振
for (n=0;n<255;n++); // 延时 1ms
while ((OSCXCN & 0x80) == 0); // 等待振荡器稳定
CLKSEL |= 0x01; // 选择外部振荡器
}
void PORT_Init (void)
{
XBR2 = 0x40; // 交叉开关使能为弱上拉
P0MDOUT |= 0x02; // 使P0口为推挽式
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -