求助!!!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!!!!!!!");

}
...全文
1573 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_37834095 2019-04-16
  • 打赏
  • 举报
回复
你好, 请教下Fix();函数原型是什么呀
正在探索 2018-06-17
  • 打赏
  • 举报
回复
我怀疑是CNF1,CNF2,CNF3处的波特率设置错了。。求问到底应该设成多少。。。
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 ### 最大似然估计方法#### 一、最大似然估计方法概述最大似然估计(Maximum Likelihood Estimation, MLE)是一种被频繁采用的参数估计技术,在统计学及机器学习领域中具有普遍的适用性。该方法的核心理念在于:在已知样本数据的前提下,选取能够最大化这些样本出现可能性的参数作为估计值。#### 二、核心原理与公式##### 2.1 定义与说明设有若干个独立同分布(i.i.d.)的数据样本\( X = \{x_1, x_2, ..., x_n\} \),这些样本源自某个概率分布模型\( f(x; \theta) \),其中\( \theta \)为待估参数。最大似然估计的目的是找到一个参数估计值\( \hat{\theta} \),使得在给定参数下观察到的样本出现的概率达到最大值。具体而言,需要解决以下问题:\[\hat{\theta} = \arg\max_{\theta} L(\theta | X)\]此处,\( L(\theta | X) \)被称为似然函数,它表示在参数\( \theta \)的条件下样本\( X \)出现的概率:\[L(\theta | X) = f(X; \theta) = \prod_{i=1}^{n} f(x_i; \theta)\]对于连续型随机变量,这里的\( f(x_i; \theta) \)指的是概率密度函数;而对于离散型随机变量,则是指概率质量函数。##### 2.2 对数似然函数由于直接计算似然函数可能面临数值计算上的挑战,特别是在样本数量较大时,连乘结果可能非常小。因此,在实际操作中通常采用对数似然函数来简...

27,519

社区成员

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

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