ARM_CAN232.rar

  • PUDN用户
    了解作者
  • Others
    开发工具
  • 232KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 4
    下载次数
  • 2008-11-15 17:25
    上传日期
本程序是LPC2000系列ARM关于CAN和RS232通讯的范例
ARM_CAN232.rar
内容介绍
/****************************************Copyright (c)************************************************** ** 广州周立功单片机发展有限公司 ** 研 究 所 ** 产品一部 ** ** http://www.zlgmcu.com ** **--------------文件信息-------------------------------------------------------------------------------- **文 件 名: MAIN.C **创 建 人: 刘养海 **最后修改日期: 2004年2月26日 **描 述: 实现简单的RS232 TO CAN,CAN T0 RS232的数据转换。通过RS232将一帧固定格式固定长度的数据发给 ** ARM,下位机将数据发往指定的CAN通道,CAN通过自接收将接收到的数据发往RS232. ** 该系统中下位机的UART0\CAN全部工作在查询模式下. ** RS232发送的数据格式必须为HEX格式,长度必须为17个字节 **RS232发送数据格式: 帧起始(SOF)+CAN通道号(1byte)+CAN帧信息(1byte)+CAN标识符(4byte)+ 数据(8 byte)+发送命令(CMD)+CRC=17byte ** CAN通道号 <4 : 0=CAN1; 1=CAN2; 2=CAN3; ** 3=CAN4; ** CAN帧信息格式 : 位偏移 7 6 5 4 3210 ** 功能 FF RTR x x DLC ** FF =0标准帧; =1扩展帧; ** RTR=0数据帧; =1远程帧; ** DLC <=8 表示要发送的字节数 ** **--------------历史版本信息---------------------------------------------------------------------------- ** 创建人: 刘养海 ** 版 本: v1.0 ** 日 期: 2004年2月26日 ** 描 述: 原始版本 ** **--------------当前版本修订------------------------------------------------------------------------------ ** 修改人: ** 日 期: ** 描 述: ** **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ #include "config.h" #define LED1 (1 << 9) /* P0.9为LED1 */ #define LED2 (1 << 8) /* P0.10为LED2 */ #define Bell_Ctr 0x00010000 // 蜂鸣器控制引脚P2.16 //测试数据格式 //12 00 88 11 11 11 11 11 11 11 11 11 11 11 11 02 00 const UINT8 HelloArmCan[]={"Wellcome to using ZLG ARMLPC2XXX CAN test program!\n",}; const UINT8 CanErr[]={"CAN Chun Err!",}; const UINT8 cCANChunl[]="CAN:"; const UINT8 cCANFif[]="FIF:"; const UINT8 cCANFid[]="FID:"; const UINT8 cCANData[]="Dat:"; UINT8 SRBuf[15]={0x00,0x88,0x12,0x34,0x56,0x78,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x01}; UINT8 STBuf[100]; // stcTxBUF CTbuf; // stcRxBUF CRBuf; // UINT32 CanSendFlag=0; // UINT32 CanRevFlag=0; UINT32 UartStatus=0,RcvCounter=0,TransCounter=0; UINT32 Main_Delay(UINT32 Delay_Time); /* ************************************************************************************************************************ **函数原型 : void UartComPol(void) **参数说明 : **返回 值 : **说 明 : 该函数用于解析RS232数据到CAN数据的协议 ************************************************************************************************************************ */ #define SOF 0x12 #define CRC 0x00 #define SOF_STATUS 00 #define DATA_STATUS 01 #define CRC_STATUS 02 void UartComPol(void) { switch(UartStatus) { case SOF_STATUS: if((UINT8)uU0RBR.Word == SOF) { UartStatus++; } break; case DATA_STATUS: SRBuf[RcvCounter++]=(UINT8)uU0RBR.Word; if(RcvCounter >14) { RcvCounter=0; UartStatus++; } break; case CRC_STATUS: if((UINT8)uU0RBR.Word == CRC) { CanSendFlag =1; //使能CAN发送 } UartStatus=0; break; default: UartStatus=0; CanSendFlag =0; RcvCounter=0; break; } } /* ************************************************************************************************************************ **函数原型 : void CanHexToRs232ASCII(UINT8 *Buf,UINT8 iBYTE) **参数说明 : **返回 值 : **说 明 :将HEX格式的CAN数据转换为RS232ASCII码格式 ************************************************************************************************************************ */ void CanHexToRs232ASCII(UINT8 *Buf,UINT8 iBYTE) { UINT8 i= iBYTE >> 4; if(i<0x0A) { *Buf = 0x30 +i; //数字0--9 } else { *Buf = 0x37 +i; //字母A--Z(大写) } i = iBYTE &0x0F; if(i<0x0A) { *(Buf+1) = 0x30 +i; } else { *(Buf+1) = 0x37 +i; } } /* ************************************************************************************************************************ **函数原型 : UINT32 RS232DataToCan(void) **参数说明 : **返回 值 : 0;成功发送;1;发送失败 **说 明 :将接收到的232数据发送到CAN ************************************************************************************************************************ */ UINT32 RS232DataToCan(void) { UINT32 status=0,i; if(SRBuf[0] > 5) { status =1; } else { CTbuf.TxFrameInfo.Bits.PRIO_BIT = SRBuf[0]; //CAN通道号 CTbuf.TxFrameInfo.Bits.FF_BIT =(SRBuf[1]&0x80) >> 7; //帧格式 CTbuf.TxFrameInfo.Bits.RTR_BIT = (SRBuf[1]&0x40)>> 6; //帧类型 CTbuf.TxFrameInfo.Bits.DLC_BIT = SRBuf[1]&0x0f; //数据长度 for(i=0;i<4;i++) { *((UINT8 *)&CTbuf.TxCANID.Word +i)=SRBuf[5-i]; } memcpy((UINT8 *)&CTbuf.CANTDA,&SRBuf[6],4); memcpy((UINT8 *)&CTbuf.CANTDB,&SRBuf[10],4); status = CANSendData(SRBuf[0],SRBuf[14],&CTbuf); } return status; } /* ************************************************************************************************************************ **函数原型 : void CanDataToRs232(void) **参数说明 : **返回 值 : **说 明 :将接收收到的CAN数据发送到RS232 ************************************************************************************************************************ */ void CanDataToRs232(void) { UINT8 i; UINT8 TempBuf[13]; TransCounter = 0; //////////////////////////////////////////// memcpy(STBuf,cCANChunl,sizeof(cCANChunl)); TransCounter += sizeof(cCANChunl)-1; //覆盖掉字符串尾的"\0" CanHexToRs232ASCII(&STBuf[TransCounter],00); TransCounter += 2; STBuf[TransCounter++]=0x0D; //回车 STBuf[TransCounter++]=0x0A; //换行 /////////////////////////////////////////// TempBuf[0]=(UINT8)CRBuf.CANRcvFS.Bits.DLC_BIT | ((UINT8)CRBuf.CANRcvFS.Bits.FF_BIT << 7)| ((UINT8)CRBuf.CANRcvFS.Bits.RTR_BIT << 6); for(i=0;i<4;i++) { TempBuf[1+i]=*((UINT8 *)&CRBuf.RxCANID + 3-i); } for(i=0;i<4;i++) { TempBuf[5+i]=*((UINT8 *)&CRBuf.CANRDA+i); } for(i=0;i<4;i++) { TempBuf[9+i]=*((UINT8 *)&CRBuf.CANRDB+i); } //Frame Infomation memcpy(&STBuf[TransCounter],cCANFif,sizeof(cCANFif)); TransCounter += sizeof(cCANFif)-1; CanHexToRs232ASCII(&STBuf[TransCounter],TempBuf[0]); TransCounter += 2; STBuf[TransCounter++]=0x0D; STBuf[TransCounter++]=0x0A; //Frame ID memcpy(&STBuf[TransCounter],cCANFid,sizeof(cCANFid)); TransCounter+= sizeof(cCANFid)-1; for(i=1;i<5;i++) { CanHexToRs232ASCII(&STBuf[TransCounter],TempBuf[i]); TransCounter += 2; } STBuf[TransCounter++]=0x0D;STBuf[TransCounter++]=0x0A; //Frame Data memcpy(&STBuf[TransCounter],cCANData,sizeof(cCANData)); TransCounter+= sizeof(cCANData)-1; if(CRBuf.CANRcvFS.Bits.DLC_BIT >8) { CRBuf.CANRcvFS.Bits.DLC_BIT =8; } for(i=5;i<CRBuf.CANRcvFS.Bits.DLC_BIT+5;i++) { CanHexToRs232ASCII(&STBuf[TransCounter],TempBuf[i]); TransCounter += 2; } STBuf[TransCounter++]=0x0D; STBuf[TransCounter++]=0x0A; STBuf[TransCounter++]=0x0D; STBuf[TransCounter++]=0x0A; //Sead Uart0Send(TransCounter, STBuf); } /* ************************************************************************************************************************ **函数原型 : int main(void) **参数说明 : **返回 值 : 无 **说 明 :主循环函数 ************************************************************************************************************************ */ int main(void) { UINT32 i,status; //UINT8 Temp[2]; //Debug Uart0 TargetResetInit(); //InitUart0(57600); //memcpy(STBuf,HelloArmCan,sizeof(H
评论
    相关推荐
    • 数据库课程设计
      数据库课程设计使用,使用MFC编写的界面,连接ODBC数据源,方便移植。
    • 数据库课程设计
      一个数据库课程设计,access管理工具实现,用的是窗体!
    • 数据库课程设计
      广东工业大学数据库课程设计,可视化界面连接数据库,delphi7
    • 数据库课程设计
      数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述 数据库课程设计实验及其描述
    • 数据库课程设计
      数据库课程设计》由周爱武、汪海威、肖云编著,遵循数据库课程设计的具体要求,独立于具体的数据库教材,从实际应用系统的需求着手,引导读者逐步完成数据库设计全过程,重点讲解数据库系统的需求分析、概念设计、...
    • 数据库课程设计
      数据库课程设计人事管理系统 数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计人事管理系统数据库课程设计...
    • 数据库课程设计
      数据库课程设计,基于visual basic自助银行管理系统,界面很清爽,实用。同学都说好,所以就上传了!!!
    • 数据库课程设计
      数据库课程设计 里面有详细的文档资料 包含数据库一切的图 以及生成的数据库表文件 期末得分为优秀
    • 数据库课程设计
      可以作为数据库课程设计,也可以作为Java的课程设计,内容全面。本资源转载的,非本人原创。用于交流学习,特此申明!
    • 数据库课程设计
      数据库课程设计蓝天大学学生管理系统 2.商店信息管理系统 3.实验室机房收费管理系统 4.图书馆资料检索系统 5.企业库存管理系统 6.仓库管理系统 7.工程项目管理系统 8.教材管理系统 9.企业人事管理系统 10.企业财务...