带SPI接口的独立CAN控制器 SIT2515 功能与MCP2515完全一致
特点:
> 芯片功能与 MCP2515 完全一致
> 适用 CAN2.0B 1.0Mb/s 的速度
0-8 字节长度数据场
支持标准帧扩展帧和远程帧
> 接收缓存、掩码与过滤码
两个带有存储优先级的接收缓存器 6 个 29 位过滤码 2 个 29 位掩码
> 采用前两个字节的数据进行报文过滤
> 三个带有发送优先级和取消发送机制的 发送缓存器
> 高速 SPI 接口(10MHz) SPI0.0 和 1.1 模式
> 单次传输模式确保报文只发送一次
> 可编程的时钟预分频引脚
> 帧起始引脚可检测帧起始信号
> 带有中断使能的中断输出引脚
> 缓存满信号输出引脚可配置为
相应接收缓存器的满中断信号
常规输入引脚
> 提供绿色环保无铅封装
> 独立的请求发送信号引脚可配置为 相应发送缓存器的请求发送信号 常规输入引脚
> 低功耗的 CMOS 工艺 工艺从 2.7-5.5V 5mA 的动态电流(典型情况下) 1μA的静态电流(典型情况下)
> 支持温度范围 工业:-40℃-85℃
其他废话不多说,直接上代码
#ifndef __MCP2515_H
#define __MCP2515_H
/* Configuration Registers */
#define CANSTAT 0x0E
#define CANCTRL 0x0F
#define BFPCTRL 0x0C
#define TEC 0x1C
#define REC 0x1D
#define CNF3 0x28
#define CNF2 0x29
#define CNF1 0x2A
#define CANINTE 0x2B
#define CANINTF 0x2C
#define EFLG 0x2D
#define TXRTSCTRL 0x0D
/* Recieve Filters */
#define RXF0SIDH 0x00
#define RXF0SIDL 0x01
#define RXF0EID8 0x02
#define RXF0EID0 0x03
#define RXF1SIDH 0x04
#define RXF1SIDL 0x05
#define RXF1EID8 0x06
#define RXF1EID0 0x07
#define RXF2SIDH 0x08
#define RXF2SIDL 0x09
#define RXF2EID8 0x0A
#define RXF2EID0 0x0B
#define RXF3SIDH 0x10
#define RXF3SIDL 0x11
#define RXF3EID8 0x12
#define RXF3EID0 0x13
#define RXF4SIDH 0x14
#define RXF4SIDL 0x15
#define RXF4EID8 0x16
#define RXF4EID0 0x17
#define RXF5SIDH 0x18
#define RXF5SIDL 0x19
#define RXF5EID8 0x1A
#define RXF5EID0 0x1B
/* Receive Masks */
#define RXM0SIDH 0x20
#define RXM0SIDL 0x21
#define RXM0EID8 0x22
#define RXM0EID0 0x23
#define RXM1SIDH 0x24
#define RXM1SIDL 0x25
#define RXM1EID8 0x26
#define RXM1EID0 0x27
/* Tx Buffer 0 */
#define TXB0CTRL 0x30
#define TXB0SIDH 0x31
#define TXB0SIDL 0x32
#define TXB0EID8 0x33
#define TXB0EID0 0x34
#define TXB0DLC 0x35
#define TXB0D0 0x36
#define TXB0D1 0x37
#define TXB0D2 0x38
#define TXB0D3 0x39
#define TXB0D4 0x3A
#define TXB0D5 0x3B
#define TXB0D6 0x3C
#define TXB0D7 0x3D
/* Tx Buffer 1 */
#define TXB1CTRL 0x40
#define TXB1SIDH 0x41
#define TXB1SIDL 0x42
#define TXB1EID8 0x43
#define TXB1EID0 0x44
#define TXB1DLC 0x45
#define TXB1D0 0x46
#define TXB1D1 0x47
#define TXB1D2 0x48
#define TXB1D3 0x49
#define TXB1D4 0x4A
#define TXB1D5 0x4B
#define TXB1D6 0x4C
#define TXB1D7 0x4D
/* Tx Buffer 2 */
#define TXB2CTRL 0x50
#define TXB2SIDH 0x51
#define TXB2SIDL 0x52
#define TXB2EID8 0x53
#define TXB2EID0 0x54
#define TXB2DLC 0x55
#define TXB2D0 0x56
#define TXB2D1 0x57
#define TXB2D2 0x58
#define TXB2D3 0x59
#define TXB2D4 0x5A
#define TXB2D5 0x5B
#define TXB2D6 0x5C
#define TXB2D7 0x5D
/* Rx Buffer 0 */
#define RXB0CTRL 0x60
#define RXB0SIDH 0x61
#define RXB0SIDL 0x62
#define RXB0EID8 0x63
#define RXB0EID0 0x64
#define RXB0DLC 0x65
#define RXB0D0 0x66
#define RXB0D1 0x67
#define RXB0D2 0x68
#define RXB0D3 0x69
#define RXB0D4 0x6A
#define RXB0D5 0x6B
#define RXB0D6 0x6C
#define RXB0D7 0x6D
/* Rx Buffer 1 */
#define RXB1CTRL 0x70
#define RXB1SIDH 0x71
#define RXB1SIDL 0x72
#define RXB1EID8 0x73
#define RXB1EID0 0x74
#define RXB1DLC 0x75
#define RXB1D0 0x76
#define RXB1D1 0x77
#define RXB1D2 0x78
#define RXB1D3 0x79
#define RXB1D4 0x7A
#define RXB1D5 0x7B
#define RXB1D6 0x7C
#define RXB1D7 0x7D
/*******************************************************************
* Control/Configuration Registers *
*******************************************************************/
/* CANINTE */
#define RX0IE_ENABLED 0x01
#define RX0IE_DISABLED 0x00
#define RX1IE_ENABLED 0x02
#define RX1IE_DISABLED 0x00
#define G_RXIE_ENABLED 0x03
#define G_RXIE_DISABLED 0x00
#define TX0IE_ENABLED 0x04
#define TX0IE_DISABLED 0x00
#define TX1IE_ENABLED 0x08
#define TX2IE_DISABLED 0x00
#define TX2IE_ENABLED 0x10
#define TX2IE_DISABLED 0x00
#define G_TXIE_ENABLED 0x1C
#define G_TXIE_DISABLED 0x00
#define ERRIE_ENABLED 0x20
#define ERRIE_DISABLED 0x00
#define WAKIE_ENABLED 0x40
#define WAKIE_DISABLED 0x00
#define IVRE_ENABLED 0x80
#define IVRE_DISABLED 0x00
/* CANINTF */
#define RX0IF_SET 0x01
#define RX0IF_RESET 0x00
#define RX1IF_SET 0x02
#define RX1IF_RESET 0x00
#define TX0IF_SET 0x04
#define TX0IF_RESET 0x00
#define TX1IF_SET 0x08
#define TX2IF_RESET 0x00
#define TX2IF_SET 0x10
#define TX2IF_RESET 0x00
#define ERRIF_SET 0x20
#define ERRIF_RESET 0x00
#define WAKIF_SET 0x40
#define WAKIF_RESET 0x00
#define IVRF_SET 0x80
#define IVRF_RESET 0x00
/* CANCTRL */
#define REQOP_CONFIG 0x80
#define REQOP_LISTEN 0x60
#define REQOP_LOOPBACK 0x40
#define REQOP_SLEEP 0x20
#define REQOP_NORMAL 0x00
#define ABORT 0x10
#define OSM_ENABLED 0x08 //使能单发模式,报文不会自动重发
/* RXBnCTRL */
#define BUKT 0x04 //如果RXB0满了,RXB0接收到的报文将被滚存到RXB1
//接收缓冲区工作模式
#define RxAllMode (3<<5) //关闭滤波功能,接收所有报文
#define RxFMExternMode (2<<5) //只接受符合条件的带有扩展标识符报文
#define RxFMStandMode (1<<5) //只接受符合条件的带有标准标识符报文
#define RxFMAllMode (0<<5) //接受符合条件的所有带有扩展标识符或带有标准标识符报文
/* TXBnDLC */
#define SIT2515_Tx_Standard_mode (0<<3)
#define SIT2515_Tx_Exit_mode (1<<3)
#define SIT2515_Tx_Data_Frame (0<<6)
#define SIT2515_Tx_Remote_Frame (1<<6)
/*******************************************************************
* Bit Timing Configuration *
*******************************************************************/
#define SJW_1TQ 0x00
#define SJW_2TQ 0x01
#define SJW_3TQ 0x02
#define SJW_4TQ 0x03
#define PHSEG1_8TQ 0x07
#define PHSEG1_7TQ 0x06
#define PHSEG1_6TQ 0x05
#define PHSEG1_5TQ 0x04
#define PHSEG1_4TQ 0x03
#define PHSEG1_3TQ 0x02
#define PHSEG1_2TQ 0x01
#define PHSEG1_1TQ 0x00
#define PRSEG_8TQ 0x07
#define PRSEG_7TQ 0x06
#define PRSEG_6TQ 0x05
#define PRSEG_5TQ 0x04
#define PRSEG_4TQ 0x03
#define PRSEG_3TQ 0x02
#define PRSEG_2TQ 0x01
#define PRSEG_1TQ 0x00
#define PHSEG2_8TQ 0x07
#define PHSEG2_7TQ 0x06
#define PHSEG2_6TQ 0x05
#define PHSEG2_5TQ 0x04
#define PHSEG2_4TQ 0x03
#define PHSEG2_3TQ 0x02
#define PHSEG2_2TQ 0x01
#define PHSEG2_1TQ 0x00
/*******************************************************************
* CAN SPI commands *
*******************************************************************/
#define CAN_RESET 0xC0
#define CAN_READ 0x03
#define CAN_WRITE 0x02
#define CAN_RTS 0x80
#define CAN_RTS_TXB0 0x81
#define CAN_RTS_TXB1 0x82
#define CAN_RTS_TXB2 0x84
#define CAN_RD_STATUS 0xA0
#define CAN_BIT_MODIFY 0x05
#define CAN_RX_STATUS 0xB0
#define CAN_RD_RX_BUFF 0x90
#define CAN_LOAD_TX 0X40
/*******************************************************************
* Miscellaneous *
*******************************************************************/
#define DUMMY_BYTE 0x00
#define TXB0 0x31
#define TXB1 0x41
#define TXB2 0x51
#define RXB0 0x61
#define RXB1 0x71
#define EXIDE_SET 0x08
#define EXIDE_RESET 0x00
typedef struct
{
unsigned char brp : 6;
unsigned char sjw : 2;
}can_cnf1_register_t;
typedef struct
{
unsigned char prseg : 3;
unsigned char phseg1 : 3;
unsigned char sam : 1;
unsigned char btlmode : 1;
}can_cnf2_register_t;
typedef struct
{
unsigned char phseg2 : 3;
unsigned char revc : 3;
unsigned char wakfil : 1;
unsigned char sof : 1;
}can_cnf3_register_t;
typedef struct
{
can_cnf1_register_t cnf1;
can_cnf2_register_t cnf2;
can_cnf3_register_t cnf3;
}can_cnf_register_t;
typedef struct
{
unsigned long StdId;
unsigned long ExtId;
unsigned char IDE;
unsigned char RTR;
unsigned char DLC;
unsigned char Data[8];
}can_transmit_msg_t;
extern void sit2515_can_init(void);
extern int sit2515_can_transmit(can_transmit_msg_t* CanTxMessage);
extern int sit2515_can_receive(can_transmit_msg_t* CanTxMessage);
extern int sit2515_set_tx_mode(unsigned char mode);
extern int sit2515_set_speed(unsigned short speed);
extern int sit2515_set_standard_filter(unsigned short Mask,unsigned short Filter);
extern int sit2515_set_extern_filter(unsigned long Mask,unsigned long Filter);
extern void sit2515_irq_enable(void);
extern void sit2515_can_sleep(void);
extern void can_transceiver_to_run(void);
extern void can_transceiver_to_standby(void);
#endif
.C文件
//sit2515写一个字节
void sit2515_write_byte(unsigned char addr,unsigned char dat)
{
CS_2515_LOW();
spi_send_byte(CAN_WRITE);
spi_send_byte(addr);
spi_send_byte(dat);
CS_2515_HIGH();
}
//sit2515读一个字节
unsigned char sit2515_read_byte(unsigned char addr)
{
unsigned char temp = 0;
CS_2515_LOW();
spi_send_byte(CAN_READ);
spi_send_byte(addr);
temp=spi_read_byte();//读取数据
CS_2515_HIGH();
return temp ;
}
//复位
void sit2515_reset(void)
{
CS_2515_LOW();
spi_send_byte(CAN_RESET);
CS_2515_HIGH();
sleepms(100);
}
//检查是否进入配置模式
int sit2515_config_mode_check(void)
{
unsigned char temp = 0 ;
int i = 0;
temp = sit2515_read_byte(CANSTAT);
while((temp&REQOP_CONFIG) == 0)
{
sit2515_write_byte(CANCTRL,REQOP_CONFIG); //MCP2515复位,进入配置模式
sleepms(1);
temp=sit2515_read_byte(CANSTAT); //读取CAN状态寄存器的值
if ((i++) >= 200){
return false;
}
}
return true;
}
//设置发送模式
//REQOP_NORMAL REQOP_LOOPBACK REQOP_LISTEN
int sit2515_set_tx_mode(unsigned char mode)
{
unsigned char temp = 0;
int i = 0;
if((mode != REQOP_NORMAL) && (mode != REQOP_LISTEN) && (mode != REQOP_LOOPBACK))
return false;
if(sit2515_config_mode_check() != true){
return false;
}
sit2515_write_byte(TXRTSCTRL, 0x00);//设置发送相关引脚控制寄存器,配置它们禁用第二功能
do
{
//sit2515_write_byte(CANCTRL,mode|OSM_ENABLED);
sit2515_write_byte(CANCTRL,mode);
sleepms(1);
temp=sit2515_read_byte(CANSTAT);//读取CAN状态寄存器的值
} while ((mode!=(temp&0xE0)) && ((i++) <= 200));
if (i >= 200) {
return false;
}
return true;
}
//设置波特率
int sit2515_set_speed(unsigned short speed)
{
unsigned char *cnf;
can_cnf_register_t can_cnf_register = {0};
if(sit2515_config_mode_check() != true){
return false;
}
switch (speed)
{
case 250:
can_cnf_register.cnf1.brp = 0;
can_cnf_register.cnf1.sjw = SJW_1TQ;
can_cnf_register.cnf2.prseg = PRSEG_4TQ;
can_cnf_register.cnf2.phseg1 = PHSEG1_8TQ;
can_cnf_register.cnf2.sam = 0;
can_cnf_register.cnf2.btlmode = 1;
can_cnf_register.cnf3.phseg2 = PHSEG2_3TQ;
can_cnf_register.cnf3.wakfil = 0;
can_cnf_register.cnf3.sof = 0;
break;
case 500:
can_cnf_register.cnf1.brp = 0;
can_cnf_register.cnf1.sjw = SJW_1TQ;
can_cnf_register.cnf2.prseg = PRSEG_1TQ;
can_cnf_register.cnf2.phseg1 = PHSEG1_3TQ;
can_cnf_register.cnf2.sam = 0;
can_cnf_register.cnf2.btlmode = 1;
can_cnf_register.cnf3.phseg2 = PHSEG2_3TQ;
can_cnf_register.cnf3.wakfil = 0;
can_cnf_register.cnf3.sof = 0;
break;
}
cnf = (unsigned char *)&can_cnf_register.cnf1;
sit2515_write_byte(CNF1, *cnf);
cnf = (unsigned char *)&can_cnf_register.cnf2;
sit2515_write_byte(CNF2, *cnf);
cnf = (unsigned char *)&can_cnf_register.cnf3;
sit2515_write_byte(CNF3, *cnf);
return true;
}
//设置接收模式
//RxAllMode RxFMExternMode RxFMStandMode RxFMAllMode
int sit2515_set_rx_mode(unsigned char mode)
{
if(sit2515_config_mode_check() != true){
return false;
}
sit2515_write_byte(BFPCTRL, 0x00); // 当有接收报文时,引脚/RX0BF 不产生中断信号
sit2515_write_byte(RXB0DLC, 0x08); // 设置RX size
sit2515_write_byte(RXB1DLC, 0x08); // 设置RX size
sit2515_write_byte(RXB0CTRL, mode|BUKT);
sit2515_write_byte(RXB1CTRL, mode);
return true;
}
/*******************************************************************************
Mask Filter ID RecviveState
0 X X OK
1 0 0 OK
1 0 1 NO
1 1 0 NO
1 1 1 OK
********************************************************************************/
//设置标准帧过滤
int sit2515_set_standard_filter(unsigned short Mask,unsigned short Filter)
{
if(sit2515_config_mode_check() != true){
return false;
}
sit2515_write_byte(RXF0SIDH,Filter>>3);
sit2515_write_byte(RXF0SIDL,(Filter<<5)|(0<<3));
sit2515_write_byte(RXM0SIDH,Mask>>3);
sit2515_write_byte(RXM0SIDL,Mask<<5);
return true;
}
//设置扩展帧过滤
int sit2515_set_extern_filter(unsigned long Mask,unsigned long Filter)
{
unsigned char RxFxLow = 0,RxMxLow = 0 ;
if(sit2515_config_mode_check() != true){
return false;
}
//29位屏蔽滤波器
sit2515_write_byte(RXF0EID8,Filter>>19);
sit2515_write_byte(RXF0EID0,Filter>>11);
sit2515_write_byte(RXF0SIDH,Filter>>3);
RxFxLow = Filter>>27;
RxFxLow |= (Filter<<5)|(1<<3);
sit2515_write_byte(RXF0SIDL,RxFxLow);
sit2515_write_byte(RXM0EID8,Mask>>19);
sit2515_write_byte(RXM0EID0,Mask>>11);
sit2515_write_byte(RXM0SIDH,Mask>>3);
RxMxLow = Mask>>27;
RxMxLow |= Mask<<5;
sit2515_write_byte(RXM0SIDL,RxMxLow);
return true;
}
void sit2515_irq_enable(void)
{
sit2515_write_byte(CANINTF,RX0IF_RESET);//清空中断标志位
sit2515_write_byte(CANINTE,G_RXIE_ENABLED);//接收缓冲器0 1满中断使能位
sit2515_set_rx_mode(RxFMAllMode);
}
//发送CAN帧
int sit2515_can_transmit(can_transmit_msg_t* CanTxMessage)
{
int64_t dly = 0 ;
unsigned char j = 0 ;
unsigned char count = 0 ;
unsigned char TXBnCTRL = 0 ;
unsigned char TXBnSIDH = 0 ;
unsigned char TXBnSIDL = 0 ;
unsigned char TXBnEID8 = 0 ;
unsigned char TXBnEID0 = 0 ;
unsigned char TXBnDLC = 0 ;
unsigned char TXBnD0 = 0 ;
unsigned char temp = 0 ;
temp = sit2515_read_byte(CANSTAT);//配置模式、监听模式、休眠模式不允许发送
if(((temp&REQOP_CONFIG) != 0) || ((temp&REQOP_LISTEN) != 0) || ((temp&REQOP_SLEEP) != 0)){
return false;
}
dly = get_ms();
while (get_ms() - dly <=100)
{
if ((sit2515_read_byte(TXB0CTRL)&0x08) == 0){
TXBnCTRL = TXB0CTRL;
TXBnSIDH = TXB0SIDH;
TXBnSIDL = TXB0SIDL;
TXBnEID8 = TXB0EID8;
TXBnEID0 = TXB0EID0;
TXBnDLC = TXB0DLC;
TXBnD0 = TXB0D0;
break ;
} else if ((sit2515_read_byte(TXB1CTRL)&0x08) == 0){
TXBnCTRL = TXB1CTRL;
TXBnSIDH = TXB1SIDH;
TXBnSIDL = TXB1SIDL;
TXBnEID8 = TXB1EID8;
TXBnEID0 = TXB1EID0;
TXBnDLC = TXB1DLC;
TXBnD0 = TXB1D0;
break ;
} else if ((sit2515_read_byte(TXB2CTRL)&0x08) == 0){
TXBnCTRL = TXB2CTRL;
TXBnSIDH = TXB2SIDH;
TXBnSIDL = TXB2SIDL;
TXBnEID8 = TXB2EID8;
TXBnEID0 = TXB2EID0;
TXBnDLC = TXB2DLC;
TXBnD0 = TXB2D0;
break ;
}
sleepms(1);
}
if (TXBnCTRL == 0){
return false;
}
if (CanTxMessage->IDE == CAN_Id_Standard) //标准帧
{
if (CanTxMessage->StdId > 0x7FF)
return false; //ID限制
//ID设置 标准帧-扩展帧
sit2515_write_byte(TXBnSIDH, CanTxMessage->StdId >> 3);//设置发送缓冲器0的标准标识符
sit2515_write_byte(TXBnSIDL, ((CanTxMessage->StdId << 5) | SIT2515_Tx_Standard_mode));//用到标准标识符
//远程请求帧
if (CanTxMessage->RTR == 1)
sit2515_write_byte(TXBnDLC, CanTxMessage->DLC | SIT2515_Tx_Remote_Frame);//将本帧待发送的数据长度写入发送缓冲器0的发送长度寄存器
//数据帧
else if (CanTxMessage->RTR == 0)
{
for (j = 0;j < CanTxMessage->DLC;j++)//数据填充
{
sit2515_write_byte(TXBnD0+j, CanTxMessage->Data[count++]);//将待发送的数据写入发送缓冲寄存器
if(count >= CanTxMessage->DLC)
break;
}
sit2515_write_byte(TXBnDLC,CanTxMessage->DLC | SIT2515_Tx_Data_Frame);//将本帧待发送的数据长度写入发送缓冲器0的发送长度寄存器
}
}
else if (CanTxMessage->IDE == CAN_Id_Extended) //扩展帧
{
unsigned char HSID,LSID;
unsigned char HEID,LEID;
HSID = (unsigned char)( CanTxMessage->ExtId >> 21);
LSID = (unsigned char)((( CanTxMessage->ExtId >> 13) & 0xE0) | (0x08) | (( CanTxMessage->ExtId >> 16) & 0x03));
HEID = (unsigned char)( CanTxMessage->ExtId >> 8);
LEID = (unsigned char)( CanTxMessage->ExtId);
sit2515_write_byte(TXBnSIDH,HSID);
sit2515_write_byte(TXBnSIDL,LSID);
sit2515_write_byte(TXBnEID8,HEID);
sit2515_write_byte(TXBnEID0,LEID);
if (CanTxMessage->RTR == 1) //远程请求帧
sit2515_write_byte(TXBnDLC,CanTxMessage->DLC | SIT2515_Tx_Remote_Frame);//将本帧待发送的数据长度写入发送缓冲器0的发送长度寄存器
else if (CanTxMessage->RTR == 0)
{
for (j = 0; j < CanTxMessage->DLC;j++)//数据填充
{
sit2515_write_byte(TXBnD0+j, CanTxMessage->Data[count++]);//将待发送的数据写入发送缓冲寄存器
if(count >= CanTxMessage->DLC)
break;
}
sit2515_write_byte(TXBnDLC, CanTxMessage->DLC | SIT2515_Tx_Data_Frame);//将本帧待发送的数据长度写入发送缓冲器0的发送长度寄存器
}
}
sit2515_write_byte(TXBnCTRL, 0x08);//请求发送报文
dly = get_ms();
while (get_ms() - dly <= 500)
{
if ((sit2515_read_byte(TXBnCTRL) & 0x08) == 0)
return true;
sleepms(1);
}
return false;
}
//接收消息
int sit2515_can_receive(can_transmit_msg_t* CanRxMessage)
{
unsigned char temp = 0 ;
unsigned char i = 0 ;
unsigned char len = 0 ;
unsigned char dat1=0,dat2=0,dat3=0,dat4=0;
unsigned char read_reg = 0;
temp = sit2515_read_byte(CANSTAT);//配置模式、休眠模式时RXB各寄存器数据无效,不允许读
if(((temp&REQOP_CONFIG) != 0) || ((temp&REQOP_SLEEP) != 0)){
return false;
}
temp = sit2515_read_byte(CANINTF);
if (temp & 0x01){
dat1 = sit2515_read_byte(RXB0SIDH);
dat2 = sit2515_read_byte(RXB0SIDL);
dat3 = sit2515_read_byte(RXB0EID8);
dat4 = sit2515_read_byte(RXB0EID0);
len = sit2515_read_byte(RXB0DLC);//读取接收缓冲器0接收到的数据长度(0~8个字节)
read_reg = RXB0D0;
temp = temp &0xFE;
} else if (temp & 0x02){
dat1 = sit2515_read_byte(RXB1SIDH);
dat2 = sit2515_read_byte(RXB1SIDL);
dat3 = sit2515_read_byte(RXB1EID8);
dat4 = sit2515_read_byte(RXB1EID0);
len = sit2515_read_byte(RXB1DLC);//读取接收缓冲器1接收到的数据长度(0~8个字节)
read_reg = RXB1D0;
temp = temp &0xFD;
} else {
return false;
}
if (((dat2 >> 3) & 0x01) == 1)
CanRxMessage->IDE = CAN_Id_Extended; //扩展帧
else
CanRxMessage->IDE = CAN_Id_Standard; //标准帧
if (CanRxMessage->IDE == CAN_Id_Extended){
CanRxMessage->ExtId = (((dat1>>3)&0x1F)<<24)|(((dat1&0x07)<<5)|((dat2&0xE0)>>3)|(dat2&0x03))<<16|dat3<<8|dat4;
if (((len >> 6) & 0x01) == 0x01)
CanRxMessage->RTR = 1; //扩展标识符 远程帧
else
CanRxMessage->RTR = 0; //扩展标识符 数据帧
} else {
CanRxMessage->StdId = (dat1 << 3) | (dat2 >> 5);//标准ID
if (((dat2 >> 4) & 0x01 ) == 1)
CanRxMessage->RTR = 1; //接收到标准 远程帧
else
CanRxMessage->RTR = 0; //接收到标准 数据帧
}
CanRxMessage->DLC = len & 0x0F; //获取数据长度
for (i = 0;i < CanRxMessage->DLC; i++) //读取数据
CanRxMessage->Data[i] = sit2515_read_byte(read_reg+i);//把CAN接收到的数据放入指定缓冲区
sit2515_write_byte(CANINTF,temp);//清除中断标志位(中断标志寄存器必须由MCU清零)
return true;
}
void sit2515_can_init(void)
{
unsigned char temp = 0 ;
int i = 0;
spi_init();
sit2515_reset();
temp = sit2515_read_byte(CANSTAT);
while((temp&REQOP_CONFIG) == 0)
{
if ((temp&REQOP_SLEEP) != 0){
sit2515_write_byte(CANINTF,WAKIF_SET);
sit2515_write_byte(CANINTE,WAKIE_ENABLED);
}
sit2515_write_byte(CANCTRL,REQOP_CONFIG);
sleepms(1);
temp=sit2515_read_byte(CANSTAT);
if ((i++) >= 1000){
break;
}
}
sit2515_write_byte(CANINTF,RX0IF_RESET);
sit2515_write_byte(CANINTE,RX0IE_DISABLED);
}
void sit2515_can_sleep(void)
{
unsigned char temp = 0 ;
int i = 0;
sit2515_write_byte(CANCTRL,REQOP_SLEEP);
temp = sit2515_read_byte(CANSTAT);
while((temp&REQOP_SLEEP) == 0)
{
sleepms(1);
temp=sit2515_read_byte(CANSTAT);
if ((i++) >= 1000){
break;
}
}
}