标题:
关于CAN总线控制器MCP2515的程序 MSP430单片机
[打印本页]
作者:
XUXUN
时间:
2020-12-23 10:39
标题:
关于CAN总线控制器MCP2515的程序 MSP430单片机
单片机源程序如下:
//配置波特率代码:
//MCP2515ByteWrite(CNF1, 3);
//MCP2515ByteWrite(CNF2, 0x80|PHSEG1_3TQ|PRSEG_1TQ);
//MCP2515ByteWrite(CNF3, PHSEG2_3TQ);
//功能:波特率的设置非常灵活,通过设置CNF1、CNF2、CNF3寄存器实现。
//CNF1中的bit5~0为分频数BRP,其对晶振频率FOSC进行分配得到TQ(时间份额)。TQ=2*(BRP+1)/FOSC当BRP=3,FOSC=8M,则TQ=2*(3+1)/8M=1us
//如为达到BRT=125kbps,位时间Tbit为波特率的倒数,Tbit=1/BRT=8us,上图4段加起来总数应等于8(当TQ=1us时)。
//同步段固定为1;若PPRSEG取1;S1和PS2占大多数,分别为3。则采样点位置为(1+1+3)/8=62.5%,采样点位置应确保在60%~90%。
//同步段:该段持续时间为 1 TQ。
//传播段:传播段的长度可编程设定为 1~8 TQ。
//相位缓冲段1(PS1):PS1 可编程设定为 1~8 TQ
//相位缓冲段2(PS2): PS2 可编程设定为 2~8 TQ
//采样点:
//同步跳转宽度 SJW SJW 可通过编程设定为 1~4 TQ 一般情况下,SJW 取值 1 T Q 即可满足要求(SJW =00)。
//CFG1 ((MCP_SJW_Mask & MCP_SJW_1TQ )|(MCP_BRP_Mask & 0x31))
// SJW同步跳转宽度位(1TQ) SJW=00 BRP波特率预分频 0x27 BRP=39
// TQ=[2*(BRP+1)]/Fsoc=2*(39+1)/8M=10us
//CFG2 (MCP_BTLMODE_EN)|(MCP_SAM_PLE_1X)|(MCP_PHSEG1_Mask & 0x02)|(MCP_PRSEG_Mask & 0x00 )
//CNF2的bit7取1, bit5~3(PHSEG1)+1为相位缓冲段PS1的TQ数, bit2~0(PRSEG)+1为传播段PRSEG的TQ数。
//相位缓冲段PS2:開啟 SAM=0,在采样点对总线进行一次采样, PHSEG1=(2+1)TQ=3TQ, PRSEG=(0+1)TQ=1TQ
//PS2由CNF3及决定 SAM:总线进行一次采样 PS2相位缓冲段:2 传播段长度:0
//CFG3 (MCP_SOF_ENABLE)|(MCP_WAKFIL_ENABLE)|(MCP_PHSEG2_Mask & 0x00)
//CNF3的bit2~0 (PHSEG2)+1位相位缓冲段PS2的TQ数。
//SOF :起始帧信号位 WAKFIL:唤醒滤波使能位 PS2相位缓冲段PS2
//PHSEG2=(2+1)TQ=3TQ, 同时当CANCTRL.CLKEN=1时设定CLKOUT引脚为时间输出使能位
//------------MCP2515 CAN模塊使用的是8M晶振(軟件計算)----------------
// speed 8M
#define MCP_8MHz_1000kbps_CFG1 (0x00)
#define MCP_8MHz_1000kbps_CFG2 (0x80)
#define MCP_8MHz_1000kbps_CFG3 (0x00)
#define MCP_8MHz_500kbps_CFG1 (0x00)
#define MCP_8MHz_500kbps_CFG2 (0x90)
#define MCP_8MHz_500kbps_CFG3 (0x02)
#define MCP_8MHz_250kbps_CFG1 (0x00)
#define MCP_8MHz_250kbps_CFG2 (0xb1)
#define MCP_8MHz_250kbps_CFG3 (0x05)
#define MCP_8MHz_200kbps_CFG1 (0x00)
#define MCP_8MHz_200kbps_CFG2 (0xb4)
#define MCP_8MHz_200kbps_CFG3 (0x06)
#define MCP_8MHz_125kbps_CFG1 (0x01)
#define MCP_8MHz_125kbps_CFG2 (0xb1)
#define MCP_8MHz_125kbps_CFG3 (0x05)
#define MCP_8MHz_100kbps_CFG1 (0x01)
#define MCP_8MHz_100kbps_CFG2 (0xb4)
#define MCP_8MHz_100kbps_CFG3 (0x06)
#define MCP_8MHz_80kbps_CFG1 (0x01)
#define MCP_8MHz_80kbps_CFG2 (0xbf)
#define MCP_8MHz_80kbps_CFG3 (0x07)
#define MCP_8MHz_50kbps_CFG1 (0x03)
#define MCP_8MHz_50kbps_CFG2 (0xb4)
#define MCP_8MHz_50kbps_CFG3 (0x06)
#define MCP_8MHz_40kbps_CFG1 (0x03)
#define MCP_8MHz_40kbps_CFG2 (0xbf)
#define MCP_8MHz_40kbps_CFG3 (0x07)
#define MCP_8MHz_31k25BPS_CFG1 (0x07)
#define MCP_8MHz_31k25BPS_CFG2 (0xa4)
#define MCP_8MHz_31k25BPS_CFG3 (0x04)
#define MCP_8MHz_20kbps_CFG1 (0x07)
#define MCP_8MHz_20kbps_CFG2 (0xbf)
#define MCP_8MHz_20kbps_CFG3 (0x07)
#define MCP_8MHz_10kbps_CFG1 (0x0f)
#define MCP_8MHz_10kbps_CFG2 (0xbf)
#define MCP_8MHz_10kbps_CFG3 (0x07)
#define MCP_8MHz_5kbps_CFG1 (0x1f)
#define MCP_8MHz_5kbps_CFG2 (0xbf)
#define MCP_8MHz_5kbps_CFG3 (0x07)
// speed 16M
#define MCP_16MHz_1000kbps_CFG1 (0x00)
#define MCP_16MHz_1000kbps_CFG2 (0xD0)
#define MCP_16MHz_1000kbps_CFG3 (0x82)
#define MCP_16MHz_666kbps_CFG1 (0x00)
#define MCP_16MHz_666kbps_CFG2 (0xA0)
#define MCP_16MHz_666kbps_CFG3 (0x04)
#define MCP_16MHz_500kbps_CFG1 (0x00)
#define MCP_16MHz_500kbps_CFG2 (0xF0)
#define MCP_16MHz_500kbps_CFG3 (0x86)
#define MCP_16MHz_250kbps_CFG1 (0x41)
#define MCP_16MHz_250kbps_CFG2 (0xF1)
#define MCP_16MHz_250kbps_CFG3 (0x85)
#define MCP_16MHz_200kbps_CFG1 (0x01)
#define MCP_16MHz_200kbps_CFG2 (0xFA)
#define MCP_16MHz_200kbps_CFG3 (0x87)
#define MCP_16MHz_125kbps_CFG1 (0x03)
#define MCP_16MHz_125kbps_CFG2 (0xF0)
#define MCP_16MHz_125kbps_CFG3 (0x86)
#define MCP_16MHz_100kbps_CFG1 (0x03)
#define MCP_16MHz_100kbps_CFG2 (0xFA)
#define MCP_16MHz_100kbps_CFG3 (0x87)
#define MCP_16MHz_95kbps_CFG1 (0x03)
#define MCP_16MHz_95kbps_CFG2 (0xAD)
#define MCP_16MHz_95kbps_CFG3 (0x07)
#define MCP_16MHz_83k3BPS_CFG1 (0x03)
#define MCP_16MHz_83k3BPS_CFG2 (0xBE)
#define MCP_16MHz_83k3BPS_CFG3 (0x07)
#define MCP_16MHz_80kbps_CFG1 (0x03)
#define MCP_16MHz_80kbps_CFG2 (0xFF)
#define MCP_16MHz_80kbps_CFG3 (0x87)
#define MCP_16MHz_50kbps_CFG1 (0x07)
#define MCP_16MHz_50kbps_CFG2 (0xFA)
#define MCP_16MHz_50kbps_CFG3 (0x87)
#define MCP_16MHz_40kbps_CFG1 (0x07)
#define MCP_16MHz_40kbps_CFG2 (0xFF)
#define MCP_16MHz_40kbps_CFG3 (0x87)
#define MCP_16MHz_33kbps_CFG1 (0x09)
#define MCP_16MHz_33kbps_CFG2 (0xBE)
#define MCP_16MHz_33kbps_CFG3 (0x07)
#define MCP_16MHz_31k25BPS_CFG1 (0x0F)
#define MCP_16MHz_31k25BPS_CFG2 (0xF1)
#define MCP_16MHz_31k25BPS_CFG3 (0x85)
#define MCP_16MHz_25kbps_CFG1 (0X0F)
#define MCP_16MHz_25kbps_CFG2 (0XBA)
#define MCP_16MHz_25kbps_CFG3 (0X07)
#define MCP_16MHz_20kbps_CFG1 (0x0F)
#define MCP_16MHz_20kbps_CFG2 (0xFF)
#define MCP_16MHz_20kbps_CFG3 (0x87)
#define MCP_16MHz_10kbps_CFG1 (0x1F)
#define MCP_16MHz_10kbps_CFG2 (0xFF)
#define MCP_16MHz_10kbps_CFG3 (0x87)
#define MCP_16MHz_5kbps_CFG1 (0x3F)
#define MCP_16MHz_5kbps_CFG2 (0xFF)
#define MCP_16MHz_5kbps_CFG3 (0x87)
//20M
#define MCP_20MHz_125kbps_CFG1 (0x04)////CF1 SJW=1TQ BRP=4
#define MCP_20MHz_125kbps_CFG2 (0xB2)////CF2 PTS=2TQ PS1=7TQ 在采样点进行一次采样
#define MCP_20MHz_125kbps_CFG3 (0x05)////CF3 PS2=6TQ
//-----------------------------------------------------------------------------------------------------------------
/*******************************************************************
* CAN SPI commands *
*******************************************************************/
//--------------------------MCP2515的SPI指令集--------------------------------
#define MCP_SPI_RESET 0xC0 //MCP2515復位 将内部寄存器复位为缺省状态,并将器件设定为配置模式
#define MCP_SPI_READ 0x03 //从
//指定地址起始的寄存器读取数据
#define MCP_SPI_WRITE 0x02 //将数据写入指定地址起始的寄存器。
#define MCP_SPI_BitMOD 0x05 //位修改 允许用户将特殊寄存器中的单独位置1或置0
//---------------------------------------------------
#define MCP_SPI_LOAD_TX0 0x40 //装载 TX0 缓冲器
#define MCP_SPI_LOAD_TX1 0x42 //装载 TX1 缓冲器
#define MCP_SPI_LOAD_TX2 0x44 //装载 TX2 缓冲器
//---------------------------------------------------
#define MCP_SPI_RTS 0x80 //TXB 请求发送功能
#define MCP_SPI_RTS_TX0 0x81 //TXB0 请求发送
#define MCP_SPI_RTS_TX1 0x82 //TXB1 请求发送
#define MCP_SPI_RTS_TX2 0x84 //TXB2 请求发送
#define MCP_SPI_RTS_ALL 0x87 //TXB0、TXB1、TXB2请求发送报文
//---------------------------------------------------
#define MCP_SPI_READ_RX0 0x90 //快速查询命令 读 RX0 缓冲器 注:在拉升CS引脚为高电平后,相关的RX标志位(CANINTF.RX0IF)将被清零
#define MCP_SPI_READ_RX1 0x94 //快速查询命令 读 RX1 缓冲器 注:在拉升CS引脚为高电平后,相关的RX标志位(CANINTF.RX1IF)将被清零
//---------------------------------------------------
#define MCP_SPI_READ_STATUS 0xA0 //快速查询命令 读取寄存器状态,可读取有关发送和接收功能的一些状态位。
#define MCP_SPI_RX_STATUS 0xB0 //快速查询命令 RX状态 ,确定匹配的滤波器和接收报文的类型 (标准帧、扩展帧和 / 或远程帧)。
//-----------------------------------------------------------------------------------------------------------------
typedef struct //MCP2515發送接收 地址 結構體
{
unsigned char CTRL; //-*-控制寄存器
unsigned char SIDH; //- -标准标识符 高位
unsigned char SIDL; //- -标准标识符 低位 【其中bit3=1 报文将发送扩展标识符】
unsigned char EID8; //- -扩展标识符 高位
unsigned char EID0; //- -扩展标识符 低位
unsigned char DLC; //- -数据长度码
unsigned char Data[8]; //- -數據
}MCP_Addr_Typedef;
// MCP2515寄存器地址列表
MCP_Addr_Typedef TXB0; //发送缓冲器0 地址 TXB0
MCP_Addr_Typedef TXB1; //发送缓冲器1 地址 TXB1
MCP_Addr_Typedef TXB2; //发送缓冲器2 地址 TXB2
MCP_Addr_Typedef RXB0; //接收缓冲器0 地址 RXB0
MCP_Addr_Typedef RXB1; //接收缓冲器1 地址 RXB1
//--------------------------------------------------------------------------------
typedef struct //MCP2515 CAN 报文数据结构
{
uint32_t StdId; //标准帧 ID 参数值:0~0x7FF StdId—bit10~bit0 共11位
uint32_t ExtId; //拓展帧 ID 参数值:0~0x1FFFFFFF ExtId—bit28~bit0 共29位
char IDE; //SIDL.bit.3 【0—标准帧 ; 1—扩展帧]】
char RTR; // DLC.bit6 【0—数据帧 ; 1—远程帧】
char DLC; //数据长度 DLC.bit3~0 参数值:0~8
char Data[8]; //数据内容 参数值:0~0xFF
}MCP2515_CAN_MSG;
//---------------------------------------------------
MCP2515_CAN_MSG TXBDATA0; //发送數據 0
MCP2515_CAN_MSG RXBDATA0; //接收數據0
uint32_t CanIdJS=0; //记录接收到ID上网总数
unsigned char CAN_MCP_Flag=0; //接收到数据标志位
char CAN_ERROR; //CAN总线错误代码
复制代码
51hei.png
(7.55 KB, 下载次数: 115)
下载附件
2020-12-23 23:04 上传
所有资料51hei提供下载:
mcp2515.zip
(87.31 KB, 下载次数: 75)
2020-12-23 10:39 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
kiterShuang
时间:
2022-8-19 20:34
厉害哦,不错哦
作者:
tiantian_90
时间:
2022-11-8 17:23
不错,正好需要,下载来学习下
作者:
小白艾世雄
时间:
2022-11-23 14:16
感谢楼主分享!学习一下。
前一段时间想硬改一个电源,后来查资料这个电源是CAN协议通信的,如果是协议控制,就不用动硬件了。
作者:
tailiangti
时间:
2022-12-26 08:53
楼主,想提问一下,我想更改他的拓展帧id,但是帧id的第一位是优先级和pf值,不知道得修改哪个寄存器
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1