|
亲爱的们,偶觉得偶的程序没得啥问题了,基本上都‘借用’ZLG老师的。
很简单就can-rs485,can就接受然后送485.
#include
#include
#include
#include //函数库,提供_cror_()右移函数
#include "sja1000_Peli.h"
unsigned char Recevive_CAN_Filter[8]={0x18,0xfd,0x08,0x3f,0x00,0x00,0x00,0x00}; //PGN=0XFD08 SA=0X3F
unsigned char BTR0,BTR1;
unsigned char isk;
sbit p34 = P3^4;
sbit p35 = P3^5;
sbit p32 = P3^2;
sfr CKCON=0x8f; //定义时钟控制寄存器
sfr IPH=0xb7;
unsigned char Rev_Buffer[13]; //存放接收到的数据
unsigned char CAN_ByteRate = 2;
/*--------------------------------------------------------------------------------------------------------
** 函数原型: void SJA1000_Config_Normal(void)
** 功能描述: 对SJA1000的正常模式的初始化配置,进入单元,确定基址:0X7F00H
** 参数说明: 无
** 返回值: 无
/*------------------------------------------------------------------------------------------------------*/
SJA1000_Config_Normal() //正常模式的初始化
{
BTR0=0x18;
BTR1=0x1c; //设置为20K波特率通信
do
{
SJAEntryResetMode(); //进入复位模式
}
while(!SJAEntryResetMode());
WriteSJAReg(REG_CAN_CDR,0xc8); //配置时钟分频寄存器,选择PeliCAN模式
WriteSJAReg(REG_CAN_MOD,0x01); //配置模式寄存器,选择双滤波、正常模式
WriteSJARegBlock(16,Recevive_CAN_Filter,8); //配置验收代码/屏蔽寄存器
WriteSJAReg(REG_CAN_BTR0,BTR0); //配置总线定时器0
WriteSJAReg(REG_CAN_BTR1,BTR1); //配置总线定时器1
SJASetBaudrateStandard(CAN_ByteRate);
WriteSJAReg(REG_CAN_OCR,0x1a); //配置输出管脚
do
{
SJAQuitResetMode(); //退出复位模式,进入工作模式
}
while(!SJAQuitResetMode());
}
/*--------------------------------------------------------------------------------------------------------
** 函数原型: void Delay_ms(uchar j)
** 功能描述: 该函数用于不精确的延时。在12M,6CLK下,大约延时j*1ms
** 参数说明: 0-255
** 返回值: 无
/*------------------------------------------------------------------------------------------------------*/
void Delay_ms(unsigned char j)
{
unsigned char k,l;
for(l=0;l<=j;l++)
{
for(k=0;k<=250;k++)
{
;
}
}
}
/*--------------------------------------------------------------------------------------------------------
** 函数原型: main()
** 功能描述: 主函数,用于初始化MCU相关资源,并显示接收到的数据帧数
** 参数说明: 无
** 返回值: 无
/*------------------------------------------------------------------------------------------------------*/
main()
{
CKCON=1; //选择6CLK
TCON=TCON|0x04; //MCU的INT1下降沿触发,INT0电平触发
EA=1; //使能MCU总中断
IP=1;
IPH=1;
TMOD=0x00;
TH0=0x00;
TL0=0x00;
TR0=1;
ET0=1;
Delay_ms(250); //延时大约1秒
Delay_ms(250);
Delay_ms(250);
Delay_ms(250);
SJA_CS_Point = &CAN_SJA_BaseAdr; //确定基址指针的值
SJA1000_Config_Normal(); //调用SJA1000初始化配置函数
WriteSJAReg(REG_CAN_CMR,4); //释放SJA1000接收缓冲区
WriteSJAReg(REG_CAN_IER,0x01); //使能SJA1000接收中断
EX0 = 1; //打开INT0中断
while(1)
{
if(ReadSJAReg(REG_CAN_RXERR) > 0)
{
p34 = !p34;
SJA1000_Config_Normal();
WriteSJAReg(REG_CAN_IER,RIE_BIT); //使能SJA1000接收中断
EX0 = 1; //打开INT0中断
}
}
}
/*--------------------------------------------------------------------------------------------------------
** 函数原型: void Receive_INTData_Form_CAN (void) interrupt 0
** 功能描述: 利用中断方式,接收SJA1000接收缓冲区的数据
** 参数说明: 无
** 返回值: 无
/*------------------------------------------------------------------------------------------------------*/
void SJA1000_INT0(void) interrupt 0
{
EA=0;
EX0=0;
p32 = 0;
if(ReadSJAReg(REG_CAN_IR)&0x01) //产生了接收中断
{
/*接收数据*/
REVSJADATA(Rev_Buffer,13); // OXC7/0XC8存密度双字节
WriteSJAReg(REG_CAN_CMR,4); //释放SJA1000接收缓冲区
WriteSJAReg(REG_CAN_IER,RIE_BIT);
P1 &= Rev_Buffer[7]; //把0xc7单元的数据放P1口
p34 = 0; //置80C2051的INT0中断标志
Delay_ms(2); // 延迟1ms
p34 = 1; //关中断
P1 &= Rev_Buffer[8]; //把0xc8单元的数据放P1口
p35 = 0; //置80C2051的INT1中断标志
Delay_ms(2); // 延迟1ms
p35 = 1; //关中断
}
ReadSJAReg(REG_CAN_ALC);
ReadSJAReg(REG_CAN_ECC);
p32 = 1;
EX0=1;
EA=1;
}
以上是其中CAN接受程序。请亲爱的们帮忙看下有啥问题,谢谢。 |
|