[CAN-bus/DeviceNet] 有人用C51模拟SPI操作MCP2515的指点一下!

[复制链接]
4338|1
 楼主| armandusb 发表于 2007-11-10 18:37 | 显示全部楼层 |阅读模式
  C51模拟SPI对MCP2515没成功,总线上波形有时候有,有时候没有,CAN调试器没发现数据,CAN调试肯定耗用<br />#include&nbsp;&nbsp;&nbsp;&quot;reg51.h&quot;<br />#include&nbsp;&nbsp;&nbsp;&quot;MCP2515.H&quot;<br />#include&nbsp;&nbsp;&nbsp;&quot;intrins.h&quot;<br /><br />sbit&nbsp;CS=P1^2;&nbsp;/*单片机P1.2为片选&nbsp;可以改为你的实际引脚&nbsp;*/<br />sbit&nbsp;SO=P1^3;/*数据输出&nbsp;*/<br />sbit&nbsp;SK=P1^5;&nbsp;/*&nbsp;时钟&nbsp;*/<br />sbit&nbsp;SI=P1^4;&nbsp;/*&nbsp;数据输入*/&nbsp;<br /><br /><br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;uint&nbsp;&nbsp;&nbsp;unsigned&nbsp;int<br />#define&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;&nbsp;unsigned&nbsp;char<br /><br />uchar&nbsp;can_boud=0x01;//修改8M下500K拨特率//MCP2515在16M晶振情况,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//can_boud=0x00总线波特率为1M,0x01=500K,0x03=250K,0x07=125K;公式:16M/(16*(1+X))<br /><br />uchar&nbsp;&nbsp;TID[2]={0,0};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//存放标准祯的ID号<br />uchar&nbsp;&nbsp;Tdate[10]={0};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送标准祯的数据,&nbsp;&nbsp;2字节ID,8字节数据<br />uchar&nbsp;&nbsp;Rdate[8]={0};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//存放接收数据<br />uchar&nbsp;RESID[4];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//存放接收到的数据帧的ID号,标准帧只用到RESID[0],RESID[1],扩展帧全部用到<br /><br />void&nbsp;&nbsp;&nbsp;Uart_init(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//串口初始化,11。0592M-------------9600<br />{<br />&nbsp;TMOD=0X22;<br />&nbsp;SCON=0X40;<br />&nbsp;TH1=0XFA;<br />&nbsp;PCON=0X80;<br />&nbsp;TR1=1;<br />&nbsp;REN=1;<br />&nbsp;}<br />void&nbsp;&nbsp;&nbsp;putchar(uchar&nbsp;&nbsp;dat)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//串口输出一字节函数<br />{<br />&nbsp;&nbsp;SBUF=dat;<br />&nbsp;&nbsp;while(!TI);<br />&nbsp;&nbsp;TI=0;<br />&nbsp;&nbsp;}<br />void&nbsp;delay_ms(uint&nbsp;del)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//延时<br />{<br /><br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;j,k;<br /><br />&nbsp;&nbsp;for(k=del;k&gt0;k--)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=24;j&gt0;j--);<br />}<br /><br />void&nbsp;&nbsp;Exint0(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//外部中断初始化<br />{<br />&nbsp;&nbsp;EA=1;<br />&nbsp;&nbsp;EX0=1;<br />&nbsp;&nbsp;IT0=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//下降沿触发<br />}<br /><br />void&nbsp;WriteSPI(uchar&nbsp;cData)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//模拟SPI发送数据<br />{<br />uchar&nbsp;cLoop;<br /><br />for(cLoop=0;cLoop&lt8;cLoop++)<br />{<br />SK=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />if((cData&0x80)==0)<br />{<br />SI=0;<br />}<br />else<br />{<br />SI=1;<br />}<br />SK=1;<br />cData&lt&lt=1;<br />}<br />}<br />unsigned&nbsp;char&nbsp;Read8(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//模拟SPI&nbsp;读1个字节&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />{<br />bit&nbsp;bData;<br />unsigned&nbsp;char&nbsp;cLoop;<br />unsigned&nbsp;char&nbsp;cData;<br />for(cLoop=0;cLoop&lt8;cLoop++)<br />{<br />SK=1;<br />SK=0;<br />bData=SO;<br />cData&lt&lt=1;<br />if(bData)<br />{<br />cData|=0x01;<br />}<br />}<br />return&nbsp;cData;<br />}<br /><br />uchar&nbsp;&nbsp;&nbsp;Read_state(uchar&nbsp;&nbsp;order)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读命令状态<br />{<br />&nbsp;&nbsp;uchar&nbsp;&nbsp;clear;<br />&nbsp;&nbsp;CS=0;<br />&nbsp;&nbsp;&nbsp;WriteSPI(order);<br />&nbsp;&nbsp;&nbsp;clear=Read8();<br />&nbsp;&nbsp;CS=1;<br />&nbsp;&nbsp;return&nbsp;&nbsp;&nbsp;clear;<br />&nbsp;}<br /><br />//**从2515指定地址Address读取一个字节数据Data**//<br />uchar&nbsp;Read_Byte(uchar&nbsp;Address)<br />{//uchar&nbsp;clear;<br />&nbsp;uchar&nbsp;date;<br />&nbsp;CS=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使能SPI器件<br />&nbsp;<br />&nbsp;//SPDR=0x03;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//送2515读指令为0x03<br />&nbsp;WriteSPI(0X03);<br />&nbsp;<br />//&nbsp;SPDR=Address;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//送地址<br />&nbsp;WriteSPI(Address);<br />&nbsp;<br />&nbsp;&nbsp;date=Read8();<br />&nbsp;CS=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关SPI器件<br />&nbsp;return&nbsp;date;<br />}<br /><br />//**向2515指定地址Address写一个字节数据Data**//<br />void&nbsp;Write_Byte(uchar&nbsp;Address,uchar&nbsp;Data)<br />{<br />&nbsp;&nbsp;CS=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使能SPI器件2515<br />&nbsp;&nbsp;WriteSPI(0X02);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;WriteSPI(Address);<br />&nbsp;&nbsp;WriteSPI(Data);<br />&nbsp;&nbsp;CS=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关SPI器件<br />}<br /><br />void&nbsp;load_Standard_ID_dates(uchar&nbsp;num)&nbsp;//给标准祯装载ID号和数据<br />{<br />&nbsp;uchar&nbsp;i,j,T0=0x36;<br />&nbsp;uchar&nbsp;TIDH,TIDL;<br />&nbsp;i=TID[1]&gt&gt3;j=TID[0]&lt&lt5;j=j+i;i=TID[1]&lt&lt5;<br />&nbsp;TIDL=i;TIDH=j;//将数组TID中的值转化为TIDH,TIDL以便给TXB0SIDH,TXB0SIDL附值<br />&nbsp;Write_Byte(CANCTRL,0x80);//CAN工作在配置模式<br />&nbsp;Write_Byte(CNF1,can_boud);<br />&nbsp;Write_Byte(TXB0SIDH,TIDH);<br />&nbsp;Write_Byte(TXB0SIDL,TIDL);<br />&nbsp;Write_Byte(TXB0DLC,num);//&nbsp;<br />&nbsp;for(i=2;i&ltnum+2;i++,T0++)Write_Byte(T0,Tdate);<br />&nbsp;}<br /><br />void&nbsp;CAN_Initialize(void)<br />{<br />&nbsp;&nbsp;WriteSPI(CAN_RESET);<br />&nbsp;&nbsp;delay_ms(20);<br />&nbsp;&nbsp;Write_Byte(CANCTRL,0x80);//CAN工作在配置模式<br />&nbsp;&nbsp;Write_Byte(CNF1,can_boud);<br />&nbsp;&nbsp;Write_Byte(CNF2,0x80&nbsp;|&nbsp;PHSEG1_3TQ&nbsp;|&nbsp;PRSEG_1TQ);//Set&nbsp;CNF2<br />&nbsp;&nbsp;Write_Byte(CNF3,PHSEG2_3TQ);<br />&nbsp;&nbsp;//0x80+0x10+0x00,相位缓冲段2由CNF3确定,相位缓冲段1为3TQ,传播段为1TQ<br />&nbsp;&nbsp;Write_Byte(RXB0CTRL,0xf0);//接收类型选择,接收所有报文<br />&nbsp;&nbsp;Write_Byte(CANINTF,0x00);//接收完一次必须对中断标志位清0<br />&nbsp;&nbsp;Write_Byte(CANINTE,0x01);//接收缓冲器0满中断使能<br />&nbsp;&nbsp;Write_Byte(CANCTRL,0x00);//选定正常工作模式<br />}<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />void&nbsp;&nbsp;int0()&nbsp;interrupt&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//外部中断处理程序<br />{&nbsp;<br />&nbsp;&nbsp;putchar(0x55);<br />}<br /><br /><br />void&nbsp;&nbsp;main(void)<br />{<br />&nbsp;uchar&nbsp;i;<br />&nbsp;Uart_init();<br />&nbsp;Exint0();<br />&nbsp;CAN_Initialize();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAN_Initialize();&nbsp;CAN_Initialize();<br />&nbsp;TID[0]=0X00;TID[1]=0X01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//ID号<br />&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;{<br />&nbsp;&nbsp;Tdate=i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//要发送的数据<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;SK=1;<br />&nbsp;&nbsp;&nbsp;SK=1;&nbsp;SK=1;<br />&nbsp;&nbsp;CS=1;<br />&nbsp;while(1)<br /><br />&nbsp;{<br />&nbsp;&nbsp;load_Standard_ID_dates(8);<br />&nbsp;&nbsp;Write_Byte(CANCTRL,0x00);//选定工作模式<br />&nbsp;&nbsp;WriteSPI(CAN_RTS_TXB0);//发送缓冲器0请求发送<br />delay_ms(60000);<br />&nbsp;&nbsp;delay_ms(60000);<br />&nbsp;&nbsp;&nbsp;delay_ms(60000);<br />&nbsp;&nbsp;&nbsp;&nbsp;delay_ms(60000);<br />&nbsp;&nbsp;delay_ms(60000);<br />&nbsp;&nbsp;delay_ms(60000);<br />&nbsp;&nbsp;delay_ms(60000);<br />&nbsp;&nbsp;&nbsp;delay_ms(60000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;delay_ms(60000);<br />&nbsp;&nbsp;delay_ms(60000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;delay_ms(60000);<br />&nbsp;&nbsp;delay_ms(60000);<br />&nbsp;&nbsp;&nbsp;delay_ms(60000);<br />&nbsp;&nbsp;&nbsp;&nbsp;delay_ms(60000);<br />&nbsp;&nbsp;delay_ms(60000);<br />&nbsp;&nbsp;delay_ms(60000);<br />&nbsp;&nbsp;delay_ms(60000);<br />&nbsp;&nbsp;&nbsp;delay_ms(60000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;delay_ms(60000);<br />&nbsp;&nbsp;delay_ms(60000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;putchar(Tdate);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}
stycx 发表于 2008-12-17 21:28 | 显示全部楼层

楼主的程序现在好了吧 请问MCP2515.H哪有得下载

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

19

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部