3.1-SJA1000编程基础

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

3.1SJA1000编程基础目录MCU访问SJA100读写寄存器精确延时寄存器位操作连续读写寄存器接口电路VCC译码电路SJA1000使用并行接口总线与MCU连接,SJA1000可以认为是一个外扩的RAM。SJA1000地址宽度为8位,最多支持256个寄存器访问SJA1000还需要产生一个合适的片选信号访问SJA1000的地址决定于低8位与高8位地址,也就是片选信号。片选信号产生方式MCU产生片选信号有一下3种:线选法1全地址译码法2部分地址译码法3优点:无需译码电路,线路简单线选法SJA1000的访问基址:A[0:7]=0x00~0xFF,A[8:15]=2_0xxxxxxxVCC译码电路使用空闲的高位地址线作为作为扩展芯片的片选信号。A[8]缺点:地址空间太多重复,地址空间没有被充分利用二进制格式优点:地址不重叠,充分利用地址空间全地址译码法SJA1000的访问基址:具体地址由译码电路决定,地址唯一VCC译码电路使用译码器对空闲的高位地址线进行译码,输出的译码信号作为扩展芯片的片选信号。缺点:译码电路较多,线路复杂优点:地址重叠少,译码电路少部分地址译码法SJA1000的访问基址:具体地址有译码电路决定,地址唯一VCC译码电路使用译码器对空闲的部分高位地址线进行译码,输出的译码信号作为扩展芯片的片选信号。缺点:地址仍有重叠A[12:15]本设计选用此译码电路MCU访问SJA1000的地址译码电路AD[0:7]A[8:11]AD[0:7]/CSA[12:15]SJA1000的访问基址:0xA000~0xAF00001010A[8:15]=0xA0~0xAFMCUSJA1000寄存器地址定义#defineREG_CAN_MOD0xA000//内部控制寄存器#defineREG_CAN_CMR0xA001//命令寄存器#defineREG_CAN_SR0xA002//状态寄存器#defineREG_CAN_IR0xA003//中断寄存器绝对编址定义寄存器#defineREG_BASE_ADD0xA000//寄存器基址#defineREG_CAN_MOD0x00//内部控制寄存器#defineREG_CAN_CMR0x01//命令寄存器#defineREG_CAN_SR0x02//状态寄存器#defineREG_CAN_IR0x03//中断寄存器基址加偏移量定义寄存器若译码电路改变,访问基值改为0xB000,只需要改变基址的定义。REG_BASE_ADD0xB000//寄存器基址#defineREG_CAN_MOD0xB000//内部控制寄存器#defineREG_CAN_CMR0xB001//命令寄存器#defineREG_CAN_SR0xB002//状态寄存器#defineREG_CAN_IR0xB003//中断寄存器如果译码电路改变,访问基值改为0xB000,寄存器的定义都需要改变。实际访问时使用基址+偏址的方式读写寄存器访问寄存器的常用操作对整个寄存器读写操作1对寄存器位进行修改2连续读写多个寄存器3目录MCU访问SJA100读写寄存器精确延时寄存器位操作连续读写寄存器定义寄存器读写指针#defineREG_BASE_ADDR0xA000//寄存器基址xdataunsignedchar*SJA_CS_Point=(xdataunsignedchar*)REG_BASE_ADDR;定义SJA_CS_Point为指向外部存储器的指针,通过指针访问SJA1000的寄存器读写寄存器//写SJA1000寄存器voidWriteSJAReg(unsignedcharRegAddr,unsignedcharValue){*(SJA_CS_Point+RegAddr)=Value;return;}//读SJA1000寄存器unsignedcharReadSJAReg(unsignedcharRegAddr){return(*(SJA_CS_Point+RegAddr));}通过指针向指定地址(SJA1000的寄存器)读取数据通过指针向指定地址(SJA1000的寄存器)写入数据目录MCU访问SJA100读写寄存器精确延时寄存器位操作连续读写寄存器寄存器0x0000001111操作示例:设置寄存器第7位寄存器位操作①设置寄存器位1:使用或操作:使用与操作0x0F|0x80寄存器0x0000001111操作示例:清0寄存器第0位00x0F&(~0x01)②清零寄存器位寄存器位操作回写寄存器修改指定位操作流程操作示例代码temp=ReadSJAReg(RegAdr);temp=temp|BitValue0;temp=temp&(~BitValue1);WriteSJAReg(RegAdr,temp);读取寄存器当前值目录MCU访问SJA100读写寄存器精确延时寄存器位操作连续读写寄存器连续读写寄存器……for(i=0;ilen;i++){WriteSJAReg(RegAdr+i,ValueBuf[i]);}……将ValueBuf[]缓存里的数据连续写入多个寄存器……for(i=0;ilen;i++){ReadSJAReg(RegAdr+i,ValueBuf[i]);}……将连续多个寄存器数据读取到ValueBuf[]缓存里目录MCU访问SJA100读写寄存器精确延时寄存器位操作连续读写寄存器延时函数voidDelay(unsigendintn){do{for(i=0;i100;i++);}while(--n!=0);}循环计数的方式实现软件延时延时是程序设计中常用的功能,常规的延时程序结构如下:这种延时程序需要根据实际测试效果调整循环次数才能得到期望的延时时间,且延时时间与MCU平台相关,移植性不好。调用延时函数精确延时使用定时器延时等待定时标志循环n次结束?N延时结束Y操作流程设定定时值voidtimerDelay(unsignedintn){}TL0=LOW_BYTE(65535UL-CUPCLK/100);TH0=HIGH_BYTE(65535UL-CPUCLK/100);TR0=1;do{}while(--n!=0);//初始化定时器voidtimerDelay(void){TMOD&=~T0_MASK;//设置定时器模式TMOD|=0x01;}初始化定时器while(!TF0){TR0=0;TF0=0;}

1 / 21
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功