[ZLG-MCU] P89X51单片机的SPI接口如何使用?

[复制链接]
2260|5
 楼主| xiaoxin1986 发表于 2009-5-7 21:54 | 显示全部楼层 |阅读模式
原来我用的是AT89C51系列单片机,因为不带SPI接口,所以是用模拟方式实现的。<br /><br />现在改用NXP的P89X51单片机,片子自带了SPI接口,启动我弄明白了,置位SPCR即可;<br /><br />搞不明白的问题:<br /><br />1、&nbsp;作主接机时收时到的数据放到哪里,是不是有专门的寄存器?还要自己设置个变量一位一位的移入操作(如果是这样那还不如用模拟方式来实现的,毕竟两种芯片的价格差得很多啊)。<br /><br />2、如何接收16位数据,因为项目里用TLC2543AD芯片,一次输出有12位和16位等几种方式,而P89V51“一个字节的数据传输结束后,SPI时钟关闭,SPIF标志置位”,那我收了前8位,后8位怎么办啊???<br /><br />
linhai1986 发表于 2009-5-9 23:26 | 显示全部楼层

re

//-------------------------------------------------<br />//Company:&nbsp;ZLGMCU<br />//MCU:&nbsp;&nbsp;P89V51RD2<br />//Crystal:&nbsp;11.0592Mhz<br />//Writer:&nbsp;&nbsp;&nbsp;ZLG900<br />//Function:&nbsp;Read/Write&nbsp;Cat25C02<br />//-------------------------------------------------<br />#include&nbsp;&quot;reg52.h&quot;<br /><br />sfr&nbsp;SPCR=0xD5;&nbsp;&nbsp;//SPI&nbsp;Control<br />sfr&nbsp;SPSR=0xAA;&nbsp;&nbsp;//SPI&nbsp;Status<br />sfr&nbsp;SPDAT=0x86;&nbsp;<br />&nbsp;<br />sbit&nbsp;CS=P1^4;<br />//sbit&nbsp;SI=P1^5;<br />//sbit&nbsp;SO=P1^6;<br />//sbit&nbsp;SCK=P1^7;<br /><br />//------------------------------------<br />//Delay():&nbsp;&nbsp;delay&nbsp;4&nbsp;ms,(11.0592MHz)<br />//------------------------------------<br />void&nbsp;&nbsp;Delay()<br />{<br />&nbsp;int&nbsp;i;<br />&nbsp;for(i=0x00;i&lt0x500;i++);<br />}<br /><br /><br />//------------------------------------<br />//SPI_Init:&nbsp;Init&nbsp;SPI&nbsp;<br />//------------------------------------<br />void&nbsp;&nbsp;SPI_Init()<br />{<br /><br />&nbsp;SPCR=0x56;&nbsp;&nbsp;//0101&nbsp;0110&nbsp;,Disable&nbsp;SPI&nbsp;Interrupt,&nbsp;Enable&nbsp;SPI,&nbsp;Master&nbsp;Mode,CHOL=0,CHOA=1;<br />&nbsp;SPSR=0x00;&nbsp;&nbsp;//0000&nbsp;0000&nbsp;,Clr&nbsp;SPIF<br />&nbsp;CS=1;<br />//&nbsp;ES=1;&nbsp;&nbsp;&nbsp;<br />//&nbsp;EA=1;<br /><br />}<br /><br />//------------------------------------<br />//EnableWrite:<br />//function:&nbsp;&nbsp;&nbsp;Enable=0,Disable&nbsp;write&nbsp;&nbsp;<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable=1,Enable&nbsp;write&nbsp;<br />//------------------------------------<br />void&nbsp;EnableWrite(char&nbsp;Enable)<br />{<br />&nbsp;CS=0;<br /><br />&nbsp;if(Enable==0)<br />&nbsp;{<br />&nbsp;&nbsp;SPDAT=&nbsp;0x04;&nbsp;&nbsp;&nbsp;&nbsp;//Disable&nbsp;Command<br />&nbsp;}<br />&nbsp;else<br />&nbsp;{<br />&nbsp;&nbsp;SPDAT=&nbsp;0x06;&nbsp;&nbsp;&nbsp;&nbsp;//Enable&nbsp;Command<br />&nbsp;}<br />&nbsp;while((SPSR&0x80)==0);<br />&nbsp;SPSR=0x00;<br /><br />&nbsp;CS=1;<br />}<br /><br />//------------------------------------<br />//ReadData:<br />//------------------------------------<br />void&nbsp;ReadData(unsigned&nbsp;char&nbsp;address,&nbsp;unsigned&nbsp;char&nbsp;*buf,&nbsp;unsigned&nbsp;char&nbsp;length)<br />{<br />&nbsp;CS=0;<br /><br />&nbsp;SPDAT=0x03;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Read&nbsp;Data&nbsp;Command<br />&nbsp;while((SPSR&0x80)==0);<br />&nbsp;SPSR=0x00;<br />&nbsp;&nbsp;<br />&nbsp;SPDAT=address;&nbsp;&nbsp;&nbsp;&nbsp;//Read&nbsp;address<br />&nbsp;while((SPSR&0x80)==0);<br />&nbsp;SPSR=0x00;<br /><br />&nbsp;while(length--)<br />&nbsp;{<br />&nbsp;&nbsp;SPDAT=0xff;<br />&nbsp;&nbsp;while((SPSR&0x80)==0);<br />&nbsp;&nbsp;*buf=SPDAT;<br /><br />&nbsp;&nbsp;buf++;<br />&nbsp;&nbsp;SPSR=0x00;<br />&nbsp;}<br /><br />&nbsp;CS=1;<br />}<br /><br /><br />//------------------------------------<br />//ReadStatus<br />//------------------------------------<br />unsigned&nbsp;char&nbsp;ReadStatus&nbsp;(void)<br />{<br />&nbsp;unsigned&nbsp;char&nbsp;status;<br /><br />&nbsp;CS&nbsp;=&nbsp;0;<br /><br />&nbsp;SPDAT&nbsp;=&nbsp;0x05;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Read&nbsp;Status&nbsp;Command<br />&nbsp;while&nbsp;((SPSR&nbsp;&&nbsp;0x80)&nbsp;==&nbsp;0);<br />&nbsp;SPSR=0x00;&nbsp;<br /><br />&nbsp;SPDAT&nbsp;=&nbsp;0xFF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Read&nbsp;SPI&nbsp;status<br />&nbsp;while&nbsp;((SPSR&nbsp;&&nbsp;0x80)&nbsp;==&nbsp;0);<br />&nbsp;status&nbsp;=&nbsp;SPDAT;<br /><br />&nbsp;SPSR=0x00;&nbsp;<br />&nbsp;CS&nbsp;=&nbsp;1;<br /><br />&nbsp;return&nbsp;(status);<br />}<br /><br />//------------------------------------<br />//WriteData:<br />//------------------------------------<br />void&nbsp;WriteData(unsigned&nbsp;char&nbsp;address,unsigned&nbsp;char&nbsp;*buf,unsigned&nbsp;char&nbsp;length)<br />{<br /><br />&nbsp;EnableWrite(1);<br />&nbsp;while&nbsp;(ReadStatus()&nbsp;&&nbsp;0x01);<br /><br />&nbsp;&nbsp;&nbsp;CS&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;SPDAT&nbsp;=&nbsp;0x02;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Write&nbsp;Data&nbsp;Command<br />&nbsp;while((SPSR&0x80)==0);<br />&nbsp;SPSR=0x00;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;SPDAT&nbsp;=&nbsp;address;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Write&nbsp;address<br />&nbsp;while((SPSR&0x80)==0);<br />&nbsp;SPSR=0x00;<br /><br />&nbsp;for&nbsp;(;&nbsp;length&gt0&nbsp;;length--&nbsp;)<br />&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;SPDAT&nbsp;=&nbsp;*buf;<br />&nbsp;&nbsp;while((SPSR&0x80)==0);<br />&nbsp;&nbsp;SPSR=0x00;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;address++;<br />&nbsp;&nbsp;buf++;<br />&nbsp;}<br />&nbsp;&nbsp;&nbsp;CS&nbsp;=&nbsp;1;<br /><br />&nbsp;Delay();<br />&nbsp;EnableWrite(0);<br />}<br /><br /><br />//------------------------------------<br />//main:<br />//------------------------------------<br />void&nbsp;main()<br />{<br />&nbsp;unsigned&nbsp;char&nbsp;temp[8];<br />&nbsp;unsigned&nbsp;char&nbsp;SaveData[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x70,0x80};<br /><br />&nbsp;SPI_Init();&nbsp;<br /><br />&nbsp;while(1)<br />&nbsp;{<br /><br />&nbsp;&nbsp;WriteData(0x00,SaveData,8);<br />&nbsp;&nbsp;ReadData(0x00,temp,8);<br /><br />&nbsp;}<br />}<br /><br />//------------------------------------<br />//END<br />//------------------------------------<br /><br />
 楼主| xiaoxin1986 发表于 2009-5-9 23:44 | 显示全部楼层

谢谢,程序已收藏,将仔细拜读

  
liqindz 发表于 2009-5-11 23:06 | 显示全部楼层

重点看看时序 和底层打交道 时序很重要

  
 楼主| xiaoxin1986 发表于 2009-5-13 00:52 | 显示全部楼层

恩,我就在时序这很容易弄乱,不知4楼的在这方面有什么心

  
linhai1986 发表于 2009-5-13 01:16 | 显示全部楼层

有时我也会弄乱,希望能与4楼的交流一下心得

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

本版积分规则

176

主题

1487

帖子

0

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