求助!!!mcp2515的报文发送不出去!!!

正在探索 2018-06-17 05:05:36
用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!!!!!!!");

}
...全文
1485 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_37834095 2019-04-16
  • 打赏
  • 举报
回复
你好, 请教下Fix();函数原型是什么呀
正在探索 2018-06-17
  • 打赏
  • 举报
回复
我怀疑是CNF1,CNF2,CNF3处的波特率设置错了。。求问到底应该设成多少。。。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧