stm32 can可以接收数据,但却无法发送数据,怎么回事

stm32 can可以接收数据,但却无法发送数据,怎么回事,第1张

这里有两个晶振,一个是单片机的你选择12M,一个是sja1000的推荐选择16M。

给你程序你不一定能用啊,还要和硬件对应啊,比如你的地址确定问题。

这就是网络的程序为什么大多不能直接使用的原因啊。

给你提供一些思路

1、sja1000初始化

2、发送子程序

3、中断方式接收

下面是一些程序段

你参考下(已用于产品)

/SJA1000初始化//

void Init_SJA1000(void)

{

uchar state;

uchar ACRR[4]={0XAA,0XFF,0X22,0X11};// 接收代码寄存器

uchar AMRR[4]={0xff,0xff,0xff,0xff};// 接收屏蔽寄存器

//uchar AMRR[4]={0x00,0x00,0xff,0xff};// 接收屏蔽寄存器

do// 使用do--while语句确保进入复位模式

{

MODR = 0x09; // 设置MOD0=1--进入复位模式,以便设置相应的寄存器

state = MODR;

}

while( !(state & 0x01) );

// 对SJA1000部分寄存器进行初始化设置

CDR = 0x88; // CDR为时钟分频器,CDR3=1--时钟关闭, CDR7=0---basic CAN, CDR7=1---Peli CAN

BTR0 = 0x04;//0x31; // 总线定时寄存器0 ;总线波特率设定

BTR1 = 0x1c;//0x1c; // 总线定时寄存器1 ;总线波特率设定

IER = 0x01; // IER0=1--接收中断使能; IER1=0--关闭发送中断使能

OCR = 0xaa; // 配置输出控制寄存器

CMR = 0x04; // 释放接收缓冲器

ACR0 = ACRR[0];// 初始化接收代码寄存器

ACR1 = ACRR[1];

ACR2 = ACRR[2];

ACR3 = ACRR[3];

AMR0 = AMRR[0];// 初始化接收屏蔽寄存器

AMR1 = AMRR[1];

AMR2 = AMRR[2];

AMR3 = AMRR[3];

do// 使用do--while语句确保退出复位模式

{

MODR = 0x08; //MOD3=0--双滤波器模式

state = MODR;

}

while( state & 0x01 );

}//////////////////////////////////////

//CAN发送数据到CAN-Bus//

void CAN_TXD(void)

{

uchar state;

//初始化标示码头信息

TX_buffer[0] = 0x88; //7=0--扩展帧;6=0--数据帧; 0-3=100--数据长度为8字节

// TX_buffer[1] = 0xFF; //本帧信息的ID

//TX_buffer[2] = 0xFF;

TX_buffer[3] = 0xFF;

TX_buffer[4] = 0xFF;

do //查询SJA1000是否处于接收状态,当SJA1000不处于接收状态时才可继续执行

{

state = SR; //SR为SJA1000的状态寄存器

}

while( state & 0x10 ); //SR4=1 正在接收,等待

do //查询SJA1000是否处于发送完毕状态

{

state = SR;

}

while(!(state & 0x08)); //SR3=0,发送请求未处理完,等待直到SR3=1

do //查询发送缓冲器状态

{

state = SR;

}

while(!(state & 0x04)); //SR2=0,发送缓冲器被锁。等待直到SR2=1

//将待发送的一帧数据信息存入SJA1000的相应寄存器中

TBSR0 = TX_buffer[0];

TBSR1 = TX_buffer[1];

TBSR2 = TX_buffer[2];

TBSR3 = TX_buffer[3];

TBSR4 = TX_buffer[4];

TBSR5 = TX_buffer[5];

TBSR6 = TX_buffer[6];

TBSR7 = TX_buffer[7];

TBSR8 = TX_buffer[8];

TBSR9 = TX_buffer[9];

TBSR10 = TX_buffer[10];

TBSR11 = TX_buffer[11];

TBSR12 = TX_buffer[12];

CMR = 0x04; //置位发送请求

}//////////////////////////////////////

//中断接收来自CAN-Bus数据//

void inter1_can_rxd( void ) interrupt 0

{

uchar state;

EA = 0; //关CPU中断

IE0 = 0; //由于是中断INT1是电平触发方式,所以需要软件将INT1的中断请求标志IE0清零

state = IR; //IR为SJA1000的中断寄存器

if( state & 0x01) //若IR0=1--接收中断

{

RX_buffer[0] = RBSR0;

RX_buffer[1] = RBSR1;

RX_buffer[2] = RBSR2;

RX_buffer[3] = RBSR3;

RX_buffer[4] = RBSR4;

RX_buffer[5] = RBSR5;

RX_buffer[6] = RBSR6;

RX_buffer[7] = RBSR7;

RX_buffer[8] = RBSR8;

RX_buffer[9] = RBSR9;

RX_buffer[10] = RBSR10;

RX_buffer[11] = RBSR11;

RX_buffer[12] = RBSR12;

RXD_flag = 1; //接收标志置位,以便进入接收处理程序

CMR = 0x04; //CMR2=1--接收完毕,释放接收缓冲器

state = ALC; //释放仲裁随时捕捉寄存器(读该寄存器即可)

state = ECC; //释放错误代码捕捉寄存器(读该寄存器即可)

}

IER = 0x01; // IER0=1--接收中断使能

EA = 1; //重新开启CPU中断

}//////////////////////////////////////

// //

希望对你能有帮助

If VCI_InitCan(devind, cannum, InitConfig) <> 0 Then 中的判断语句的条件进行计算的时候已经调用了函数

你的代码不全,没找到初始化的的代码

判断语句的前面应该有DIM InitConfig AS VCI_INIT_CONFIG

这句,这句后面就是初始化的代码

以上就是关于stm32 can可以接收数据,但却无法发送数据,怎么回事全部的内容,包括:stm32 can可以接收数据,但却无法发送数据,怎么回事、求CAN总线调试成功的代码,芯片是SJA1000和TJA1050、请问can总线通信卡的驱动程序该如何安装呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9771165.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存