LPC2138中SPI驱动数码管不成功?

[复制链接]
 楼主| 发表于 2008-3-30 02:20 | 显示全部楼层 |阅读模式
我拿的是ZLG的LPC2138的板子,测试的时候基本是用它自带的程序,但是每次试验都不成功。我怀疑自带的程序有问题,因为我已经找出一个错误了。蜂鸣器本来是低电平驱动的,它变成了高电平驱动。郁闷~我现在把它的SPI通过74LS595驱动数码管的程序发上来:<br />它的原理图如下:<br /><br /><br />/********************************************************************************************************<br />**&nbsp;函数名称:DelayNS()<br />**&nbsp;函数功能:长软件延时<br />**&nbsp;入口参数:dly&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;延时参数,值越大,延时越久<br />**&nbsp;出口参数:无<br />********************************************************************************************************/<br />void&nbsp;&nbsp;DelayNS(uint32&nbsp;&nbsp;dly)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for(;&nbsp;dly&gt0;&nbsp;dly--)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt50000;&nbsp;i++);<br />}<br /><br />void&nbsp;disp(uint8&nbsp;num)<br />{uint8&nbsp;i,outdata;<br />&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;{outdata=num&0x80;<br />&nbsp;&nbsp;num=num&lt&lt1;<br />&nbsp;&nbsp;if(outdata==0x80)<br />&nbsp;&nbsp;{IOSET&nbsp;|=&nbsp;(1&nbsp;&lt&lt&nbsp;29);//p0_1=1;<br />&nbsp;&nbsp;&nbsp;IOSET&nbsp;|=&nbsp;(1&nbsp;&lt&lt&nbsp;4);//p0_0=1;<br />&nbsp;&nbsp;&nbsp;DelayNS(100);<br />&nbsp;&nbsp;&nbsp;IOCLR&nbsp;|=&nbsp;(1&nbsp;&lt&lt&nbsp;4);//p0_0=0;<br />&nbsp;&nbsp;}<br />&nbsp;else&nbsp;<br />&nbsp;&nbsp;{IOCLR&nbsp;|=&nbsp;(1&nbsp;&lt&lt&nbsp;29);//p0_1=0;<br />&nbsp;&nbsp;&nbsp;IOSET&nbsp;|=&nbsp;(1&nbsp;&lt&lt&nbsp;4);//p0_0=1;<br />&nbsp;&nbsp;&nbsp;DelayNS(100);<br />&nbsp;&nbsp;&nbsp;IOCLR&nbsp;|=&nbsp;(1&nbsp;&lt&lt&nbsp;4);//p0_0=0;<br />&nbsp;&nbsp;}<br />&nbsp;}<br />}<br /><br /><br /><br /><br />/********************************************************************************************************<br />**&nbsp;函数名称:MSPI_Init()<br />**&nbsp;函数功能:初始化SPI接口,设置为主机。<br />**&nbsp;入口参数:无<br />**&nbsp;出口参数:无<br />*********************************************************************************************************/<br />/*void&nbsp;&nbsp;MSPI_Init(void)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//PINSEL0&nbsp;=&nbsp;(PINSEL0&nbsp;&&nbsp;0xFFFF00FF)&nbsp;|&nbsp;0x00005500;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置管脚连接SPI<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;(PINSEL0&nbsp;&&nbsp;(~(0xFF&nbsp;&lt&lt&nbsp;8)))&nbsp;|&nbsp;(0x55&nbsp;&lt&lt&nbsp;8)&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;SPCCR&nbsp;=&nbsp;0x52;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置SPI时钟分频<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPCR&nbsp;&nbsp;=&nbsp;(0&nbsp;&lt&lt&nbsp;3)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CPHA&nbsp;=&nbsp;0,&nbsp;数据在SCK&nbsp;的第一个时钟沿采样<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&nbsp;&lt&lt&nbsp;4)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;CPOL&nbsp;=&nbsp;1,&nbsp;SCK&nbsp;为低有效<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1&nbsp;&lt&lt&nbsp;5)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;MSTR&nbsp;=&nbsp;1,&nbsp;SPI&nbsp;处于主模式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0&nbsp;&lt&lt&nbsp;6)&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;LSBF&nbsp;=&nbsp;0,&nbsp;SPI&nbsp;数据传输MSB&nbsp;(位7)在先<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(0&nbsp;&lt&lt&nbsp;7);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SPIE&nbsp;=&nbsp;0,&nbsp;SPI&nbsp;中断被禁止<br />}*/<br /><br />/********************************************************************************************************<br />**&nbsp;函数名称:MSPI_SendData()<br />**&nbsp;函数功能:向SPI总线发送数据。<br />**&nbsp;入口参数:data&nbsp;&nbsp;&nbsp;待发送的数据<br />**&nbsp;出口参数:返回值为读取的数据<br />********************************************************************************************************/<br />/*uint8&nbsp;&nbsp;MSPI_SendData(uint8&nbsp;data)<br />{&nbsp;&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;|=&nbsp;(1&nbsp;&lt&lt&nbsp;10);<br />&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;//&nbsp;IOCLR&nbsp;=&nbsp;HC595_CS;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;片选74HC595<br />&nbsp;&nbsp;&nbsp;IOCLR&nbsp;=&nbsp;HC595_CS;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;片选74HC595<br />&nbsp;&nbsp;&nbsp;&nbsp;SPDR&nbsp;=&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(&nbsp;0&nbsp;==&nbsp;(SPSR&nbsp;&&nbsp;0x80));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;等待SPIF置位,即等待数据发送完毕<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;//&nbsp;IOSET&nbsp;=&nbsp;HC595_CS;<br />&nbsp;&nbsp;&nbsp;IOSET&nbsp;=&nbsp;HC595_CS;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;|=&nbsp;(1&nbsp;&lt&lt&nbsp;10);<br />&nbsp;&nbsp;&nbsp;&nbsp;return(SPDR);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}*/<br /><br /><br />/*&nbsp;此表为LED0~F以及L、P的字模&nbsp;*/<br />uint8&nbsp;const&nbsp;DISP_TAB[19]&nbsp;=&nbsp;{<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,&nbsp;0x80,0x90,<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;&nbsp;&nbsp;&nbsp;E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F<br />&nbsp;&nbsp;&nbsp;&nbsp;0x88,&nbsp;0x83,&nbsp;0xC6,&nbsp;0xA1,0x86,&nbsp;0x8E,<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P&nbsp;&nbsp;&nbsp;&nbsp;C<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xC7,&nbsp;0x8C,0xC6&nbsp;};<br /><br />/*&nbsp;此表为LPC2131字模&nbsp;*/<br />//&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;&nbsp;&nbsp;&nbsp;L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br />uint8&nbsp;const&nbsp;LPC2131[7]&nbsp;=&nbsp;{&nbsp;0xC7,&nbsp;0x8C,&nbsp;0xC6,&nbsp;0xA4,&nbsp;0xF9,&nbsp;0xB0,&nbsp;0xF9};<br />/********************************************************************************************************<br />**&nbsp;函数名称:main()<br />**&nbsp;函数功能:使用硬件SPI,74HC595驱动控制7段数码管显示。&nbsp;&nbsp;<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;先显示0~F的字模,然后显示LPC2131字样。<br />********************************************************************************************************/<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;rcv_data;&nbsp;<br />int&nbsp;main&nbsp;(void)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;i;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;0x00005500;&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;&nbsp;&nbsp;&nbsp;//&nbsp;设置SPI管脚连接<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL1&nbsp;=&nbsp;0x00000000;<br />&nbsp;&nbsp;&nbsp;&nbsp;IODIR&nbsp;=&nbsp;HC595_CS;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;//&nbsp;&nbsp;&nbsp;MSPI_Init();&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;初始化SPI接口<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;显示0~F字模&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt16;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp(&nbsp;DISP_TAB);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;发送显示数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DelayNS(80);&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;&nbsp;&nbsp;&nbsp;//&nbsp;延时<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;显示LPC2131字样&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt16;&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disp(&nbsp;DISP_TAB);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;发送显示数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DelayNS(80);&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;&nbsp;&nbsp;&nbsp;//&nbsp;延时<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br />不知道哪里有问题,我看原理图觉得它的管脚都接错了。呵呵。
发表于 2008-3-31 12:29 | 显示全部楼层

likee:你好!

  
发表于 2008-4-1 00:39 | 显示全部楼层

re

怎么只有IODIR&nbsp;=&nbsp;HC595_CS;<br />看不出有其它IO的定义呢。<br />是否IO设置有问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

478

帖子

2

粉丝
快速回复 返回顶部 返回列表