基于can总线的温湿度及光感度测量_单片机课程设计(编辑修改稿)内容摘要:

********/ char quit_RST(void) { unsigned char MID_DATA。 //定义一个字节变量,用于存储从 SJA1000 控制寄存器读出的数据 MID_DATA = Read_Reg(CONTROL)。 //访问 SJA1000 控制寄存器,保存原始值 Write_Reg(CONTROL,MID_DATAamp。 0xfe)。 //置位复位请求 if((Read_Reg(CONTROL)amp。 0x01)==0) //读 SJA1000 的控制寄存器数值,判断清除复位请求是否有效 {return 0。 } //0:表示 SJA1000 成功退出复位工作模式 else {return 1。 } } /********************************************************* 函数原型: char set_rate(unsignen char CAN_rate_num) 函数功能:用于设置 CAN 总线的通信波特率,只能在 SJA1000 进入复位模式下使用 基于 CAN 总线的温湿度及光感度测量 参数说明:参数 CAN_rate_num 用于存放 CAN 通信波特率的数组列表中的系列号,范围为 0~12. 返回值说明: 0:波特率设置成功 1:波特率设置失败 **********************************************************/ unsigned char rate_tab[]={ 0x53,0x2f, //20kbit/s 的波特率预设值 0x87,0xff, //40kbit/s 0x47,0x2f, //50kbit/s 0x83,0xff, //80kbit/s 0x43,0x2f, //100kbit/s 0x03,0x1c, //125kbit/s 0x81,0xfa, //200kbit/s 0x01,0x1c, //250kbit/s 0x80,0xfa, //400kbit/s 0x00,0x1c, //500kbit/s 0x80,0xb6, //666kbit/s 0x00,0x16, //800kbit/s 0x00,0x14 //1000kbit/s }。 // char set_rate (unsigned char CAN_rate_num) { char wrong_flag=1。 unsigned char BIT0_data,BIT1_data。 //用于存放从波特率数组中读出来的数值 unsigned char wrong_count=32。 //32 次报错次数 if(CAN_rate_num12) //设置数组列表中的序列号范围为 0~12 { wrong_flag=1。 } //如果超出范围,报警,波特率设置失败 else { while(wrong_count) //最多 32 次设置 SJA1000 内部寄存器 BIT0 和 BIT1 { BIT0_data=rate_tab[CAN_rate_num*2]。 BIT1_data=rate_tab[CAN_rate_num*2+1]。 //将波特率的设置值从数组中读出 Write_Reg(BIT_0,BIT0_data)。 //访问 CAN 总线定时寄存器 0,写入参数 if(Read_Reg(BIT_0) != BIT0_data )continue。 //校验写入值 Write_Reg(BIT_1,BIT1_data)。 //访问 CAN 总线定时寄存器 1,写入参数 if(Read_Reg(BIT_1) != BIT1_data )continue。 //校验写入值 wrong_flag = 0。 基于 CAN 总线的温湿度及光感度测量 break。 } //while 结束 } return wrong_flag。 } /********************************************************* 函数 原型: char set_ACR_AMR(unsignen char ACR_DATA,unsignen char AMR_DATA) 函数功能:用于设置验收代码寄存器( ACR),屏蔽寄存器( AMR)只能在 SJA1000进入复位模式下使用 参数说明: ACR_DATA :用于存放验收代码寄存器( ACR)的参数值 AMR_DATA :用于存放验收代码寄存器( AMR)的参数值 返回值说明: 0:通信对象设置成功 1:通信对象置失败 **********************************************************/ char set_ACR_AMR(unsigned char ACR_DATA,unsigned char AMR_DATA) //滤波器设计 { Write_Reg(ACR,ACR_DATA)。 //访问 CAN 总线验收代码寄存器,写入参数 if(Read_Reg(ACR) != ACR_DATA)//校验写入值 {return 1。 } Write_Reg(AMR,AMR_DATA)。 //访问 CAN 总 线验收代码寄存器,写入参数 if(Read_Reg(AMR) != AMR_DATA)//校验写入值 {return 1。 } return 0。 } /********************************************************* 函数原型: char set_CLK (unsigned char SJA_OUT_MODE,unsigned char SJA_Clock_Out) 函数功能:用于设置输出寄存器( OCR)的参数、时钟分频寄存器( CDR)的参数, 只能在 SJA1000 进入复位模式下使用 参数说明: SJA_OUT_MODE :用于存放输出寄存器( OC)的参数 SJA_Clock_Out :用于存放时钟分频寄存器( CDR)的参数 返回值说明: 0:设置( OCR)和( CDR)寄存器成功 1:设置( OCR)和( CDR)寄存器失败 **********************************************************/ char set_CLK (unsigned char SJA_OUT_MODE,unsigned char SJA_Clock_Out) { Write_Reg(OCR,SJA_OUT_MODE)。 //访问输出控制寄存器,写入设置的 OCR 参数值 if(Read_Reg(OCR) != SJA_OUT_MODE)//校验写入值 {return 1。 } 基于 CAN 总线的温湿度及光感度测量 Write_Reg(CDR,SJA_Clock_Out)。 //访问输出控制寄存器,写入设置的 CDR 参数值 // if(Read_Reg(CDR) != SJA_Clock_Out)//校验写入值 // {return 1。 } return 0。 } /********************************************************* 函数原型: char SJA_send_data(unsigned char *senddatabuf) 函数功能:用于发送 CAN 总线一帧数据(数据帧或远程帧)到 SJA1000 的发送缓冲区, 数据帧长度不大于 8 字节 参数说明: senddatabuf :指向的用于存放发送数据的数组的首址 返回值说明: 0:将发送数组的数据成功送至 SJA1000 的发送区 1: SJA1000 正在接收信息,或 SJA1000 的发送缓冲区被锁定, 或上一次发送的一帧数据还没有完成发送 **********************************************************/ char SJA_send_data(unsigned char *senddatabuf) //gai!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! { unsigned char send_num,STATUS_data。 unsigned char i。 STATUS_data = Read_Reg(STATUS)。 //读取状态寄存器数值到 STATUS_data if(STATUS_data amp。 0x10) {return 1。 } //STATUS_data^4,表示 SJA1000 在接收信息 if((STATUS_data amp。 0x04)==0)//判断 SJA1000 发送缓冲区是否为锁定状态 ,0 锁定 {return 1。 } if((STATUS_data amp。 0x08)==0)//判断上次发送是否完成, 0 上次发送未完成 {return 1。 } senddatabuf[0] = 0xAC。 senddatabuf[1] = 0x06。 Write_Reg(TxBuffer1,senddatabuf[0])。 Write_Reg(TxBuffer2,senddatabuf[1])。 if((senddatabuf[1]amp。 0x10)==0) //判断 RTR 位,是数据帧还是远程帧判定 { send_num = (senddatabuf[1]amp。 0x0f)。 //是数据帧,则取一帧 CAN 数据的第 2 字节的低 4 位, //计算得出发送数据的长度 if(send_num8) //发送最大长度为 8 个字节 send_num = 8。 for(i=0。 i send_num。 i++) { Write_Reg(TxBuffer3+i,senddatabuf[2+i])。 基于 CAN 总线的温湿度及光感度测量 delay_us(2)。 } } else { send_num=0。 //是远程帧,则发送数据长度为 0 for(i=0。 i send_num。 i++) { Write_Reg(TxBuffer3+i,senddatabuf[2+i])。 delay_us(2)。 } } SJA_mand_control(0x01)。 //调用发送请求 return 0。 } /********************************************************* 函数原型: char SJA_rcv_data(unsigned char *rcvdatabuf) 函数功能:用于接收 CAN 总线 一帧数据 参数说明: rcvdatabuf :指向的用于存放发送数据的数组的首址 返回值说明: 0:成功接收 CAN 总线的一帧数据 1:接收 CAN 总线的一帧数据失败 **********************************************************/ char SJA_rcv_data(unsigned char *rcvdatabuf) { unsigned char rcv_num,STATUS_data。 STATUS_data = Read_Reg(STATUS)。 //读取状态寄存器数值到 STATUS_data if((STATUS_data amp。 0x01)==0) //判断接收缓冲区中是否有信息,为 0 表示。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。