测试下使用SPI方式驱动MCP2515来实现CAN通信,这次测试下CAN发送数据功能。
一、电路
1.1、使用SPI0端口
1.2、CAN通信电路
二、程序
2.1、main.c
- #include "config.h"
- void main(void)
- {
- uint i=0;
- uchar js=0;
- uchar can_tx_buf[8];
-
- Init_led();
- Init_uart(32, 9600);
- uart_chl(1); //usb-ttl
- Init_mcp2515();
- while(1)
- {
- js++;
- can_tx_buf[7]=js;
- CAN_Send(can_tx_buf);
- for(i=0;i<50000;i++);
- }
- }
2.2、mcp2515.c
- #include "config.h"
- bit SPI0Flag;
- void SPI0_Init(void)
- {
- OTCON |= 0X10; //SPI0
- US0CON0 = 0x3F;
- US0CON1 = 0x01;
- US0CON0 |= 0x80;
- IE1 |= 0x01;
- EA = 1;
- }
- void SpiInt(void) interrupt 7
- {
- if(US0CON1&0X08)
- {
- US0CON1 &= ~0X08;
- }
- if(US0CON1&0X80)
- {
- US0CON1 &= ~0X80;
- SPI0Flag = 1;
- }
- }
- void SPI0_WRITE(uchar dat)
- {
- US0CON2 = dat;
- while(!SPI0Flag);
- SPI0Flag = 0;
- }
- void MCP2515_Reset(void)
- {
- CAN_CS=0;
- SPI0_WRITE(CAN_RESET);
- CAN_CS=1;
- }
- void MCP2515_BitModity(uchar addr, uchar msk, uchar dat)
- {
- CAN_CS=0;
- SPI0_WRITE(CAN_BIT_MODIFY);
- SPI0_WRITE(addr);
- SPI0_WRITE(msk);
- SPI0_WRITE(dat);
- CAN_CS=1;
- return;
- }
- void SPI0_WriteByte(uchar adr,uchar dat)
- {
- CAN_CS=0;
- SPI0_WRITE(CAN_WRITE);
- SPI0_WRITE(adr);
- SPI0_WRITE(dat);
- CAN_CS=1;
- }
- void CAN_Send(uchar *CAN_TX_Buf)
- {
- uint i;
- MCP2515_BitModity(TXB0CTRL,0x08,0x00);
- SPI0_WriteByte(TXB0SIDH,0x55);
- SPI0_WriteByte(TXB0SIDL,0x08);
- SPI0_WriteByte(TXB0EID8,0x55);
- SPI0_WriteByte(TXB0EID0,0x88);
- SPI0_WriteByte(TXB0DLC,DLC_8);
- SPI0_WriteByte(TXB0D0,CAN_TX_Buf[0]);
- SPI0_WriteByte(TXB0D1,CAN_TX_Buf[1]);
- SPI0_WriteByte(TXB0D2,CAN_TX_Buf[2]);
- SPI0_WriteByte(TXB0D3,CAN_TX_Buf[3]);
- SPI0_WriteByte(TXB0D4,CAN_TX_Buf[4]);
- SPI0_WriteByte(TXB0D5,CAN_TX_Buf[5]);
- SPI0_WriteByte(TXB0D6,CAN_TX_Buf[6]);
- SPI0_WriteByte(TXB0D7,CAN_TX_Buf[7]);
- CAN_CS=0;
- SPI0_WRITE(CAN_RTS | 0x01);
- CAN_CS=1;
- }
- void Init_mcp2515(void)
- {
- uint i;
- P0CON &= ~0x02; //CANCS
- P0CON |= 0x02;
- P0PH |= 0x02;
-
- SPI0_Init(); //SPI INIT
-
- MCP2515_Reset();
- for(i=0;i<5000;i++);
-
- MCP2515_BitModity(CANCTRL,0xE0,0x80);
- SPI0_WriteByte(CNF1,0x04); //100k
- SPI0_WriteByte(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ);
- SPI0_WriteByte(CNF3,PHSEG2_3TQ);
- SPI0_WriteByte(CANINTF,0x00);
- SPI0_WriteByte(CANINTE,0x03);
-
- MCP2515_BitModity(CANCTRL,0xE0,0x00);
- }
2.3、mcp2515.h
三、测试结果
通过CAN卡查看接收的数据。
|