用C語言寫的,代碼如下:
#include "mcu.h"
#include "str.h"
#include "SPI.h"
#include "UART.h"
#include "UART1.h"
#include "EXTIN.h"
#define Inst_ReadRX_Base 0x90 //1001 0mn0
#define Inst_Reset 0xC0 //1100 0000
#define Inst_Read 0x03 //0000 0011
#define Inst_Write 0x02 //0000 0010
#define Inst_WriteTX_Base 0x40 //0100 0abc
#define Inst_RTS_Base 0x80 //1000 0nnn
#define Inst_Read_State 0xA0 //1010 0000
#define Inst_RX_State 0xB0 //1011 0000
#define Inst_Fix 0x05 //0000 0101
/*******************
TXB0發送緩沖器
*******************/
#define TXB0CTRL 0x30
#define TXRTSCTRL 0x0D
#define TXB0SIDH 0x31
#define TXB0SIDL 0x32
#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
/*********************
時序
*********************/
#define CNF1 0x2A
#define CNF2 0x29
#define CNF3 0x28
/*********************
中斷
*********************/
#define CANINTE 0x2B
#define CANINTF 0x2C
/*********************
控制及狀態暫存器
*********************/
#define CANCTRL 0x0F
#define CANSTAT 0x0E
/****************************************************
SPI讀寫函式說明區
****************************************************/
/****************************
功能:實作MCP的軟復位
****************************/
void Reset(){
RT_SPI_CSOn();
RT_SPI_Clr();
RT_SPI_Write(Inst_Reset);
while (RT_SPI_Busy()) {}
RT_SPI_CSOff();
puts("\nreset MCP");
}
/****************************
功能:讀取并輸出相應暫存器的值
****************************/
void Read(int add){
RT_SPI_CSOn();
RT_SPI_Clr();
RT_SPI_Write(Inst_Read);
RT_SPI_Write(add);
RT_SPI_Write(0xFF);
while(!RT_SPI_DataRdy()){}
puts(xtoa(RT_SPI_Read_()));
while(RT_SPI_Busy()){}
RT_SPI_CSOff();
}
/******************************
功能:給相應暫存器賦值
******************************/
void Write(int add,int val){
RT_SPI_CSOn();
RT_SPI_Clr();
RT_SPI_Write(Inst_Write);
RT_SPI_Write(add);
RT_SPI_Write(val);
while(RT_SPI_Busy()){}
RT_SPI_CSOff();
}
/******************************
功能:讀取并回傳相應暫存器的值
******************************/
int Read_(int add){
int outcome;
RT_SPI_CSOn();
RT_SPI_Clr();
RT_SPI_Write(Inst_Read);
RT_SPI_Write(add);
RT_SPI_Write(0xFF);
while(!RT_SPI_DataRdy()){}
puts(xtoa(outcome=RT_SPI_Read_()));
while(RT_SPI_Busy()){}
RT_SPI_CSOff();
return outcome;
}
/******************************
功能:實作暫存器的位修改
******************************/
void Fix(int add,int hide,int val){
RT_SPI_CSOn();
RT_SPI_Clr();
RT_SPI_Write(Inst_Fix);
RT_SPI_Write(add);
RT_SPI_Write(hide);
RT_SPI_Write(val);
while(RT_SPI_Busy()){}
RT_SPI_CSOff();
}
/********************************
功能:MCP模式設定
********************************/
void MCP_ModeSet(int mode){
switch(mode){
case 1: //Setting
Fix(0x0F,0xE0,0b10000000);
puts("\nSet to the Setting Mode!\n");
break;
case 2: //Normal
Fix(0x0F,0xE0,0b00000000);
puts("\nNormal mode\n");
break;
case 3: //Sleeping
Fix(0x0F,0xE0,0b00100000);
break;
case 4: //Listening
Fix(0x0F,0xE0,0x01100000);
break;
case 5: //Cycle
Fix(0x0F,0xE0,0x01000000);
break;
}
}
void user_interrupt(){
puts("\ninterrupt!!!\n");
RT_EXINT_ClrAll();
RT_EXINT_Set(1, 0);
}
void main(){
RT_UART1_Off();
RT_SPI_ModeSet(0);
puts("\nM2 initialized");
RT_EXINT_Set(1, 0);
RT_EXINT_ClrAll();
//對MCP2515進行軟復位
Reset();
//不放心是否進入配置模式,再次寫入確保進入配置模式
MCP_ModeSet(1);
//進行檢查
// while(Read_(0x0F)&0x87==0x87){
// puts("\n!!!!!!!real setting mode!!!!!!!\n ");
// }
//在配置模式下設定時序,清空不必要的功能
Write(CNF1,0b00000100);//SJW=1,BRP=4
Write(CNF2,0b10110001);//采樣一次,PS1=7,PRSEG=1
Write(CNF3,0b01000101);//PS2=6
Write(TXRTSCTRL,0x00);
//回傳正常模式
MCP_ModeSet(2);
//檢查正常模式
// while(Read_(0x0F)&0x07==0x07){
// puts("\n!!!!!!!real normal mode!!!!!!!\n");
// }
//初始化緩沖器
Write(TXB0D0,0x00);
Write(TXB0D1,0x00);
Write(TXB0D2,0x00);
Write(TXB0D3,0x00);
Write(TXB0D4,0x00);
Write(TXB0D5,0x00);
Write(TXB0D6,0x00);
Write(TXB0D7,0x00);
//設定中斷使能,并對中斷初始化
Fix(CANINTE,0b10000100,0b10000100);
Write(CANINTF,0x00);
//檢查中斷是否清空
while(Read_(CANINTF)&0x00==0x00){
puts("\n!!!having cleared the interrupt!!!\n");
}
//對發送緩沖器進行寫入
//清空TXREQ位表示緩沖器中無等待報文
Fix(TXB0CTRL,0b00001000,0b00000000);
//將TXB0的優先級設為最高
Fix(TXB0CTRL,0b00000011,0b00000011);
//發送標準幀,寫入標準標識位
Write(TXB0SIDH,0xF0);
Write(TXB0SIDL,0xE0);
//寫入資料長度及資料
Write(TXB0DLC,0x08);
Write(TXB0D0,0xF0);
Write(TXB0D1,0xF0);
Write(TXB0D2,0xF0);
Write(TXB0D3,0xF0);
Write(TXB0D4,0xF0);
Write(TXB0D5,0xF0);
Write(TXB0D6,0xF0);
Write(TXB0D7,0xF0);
//將TXREQ置1請求發送
Fix(TXB0CTRL,0b00001000,0b00001000);
//等待發送完成
while(Read_(TXB0CTRL)&0xFF==0x1B){}
//發送完成后輸出表示完成
puts("\n!!!!!!!SENDED!!!!!!!");
}
uj5u.com熱心網友回復:
我懷疑是CNF1,CNF2,CNF3處的波特率設定錯了。。求問到底應該設成多少。。。uj5u.com熱心網友回復:
你好, 請教下Fix();函式原型是什么呀轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/137421.html
標籤:單片機/工控
上一篇:bugku(3,4題)
