[ZLG-ARM] LPC2294的SPI做主机时SSEL的问题!

[复制链接]
3982|5
 楼主| ygl_bj 发表于 2007-4-13 08:21 | 显示全部楼层 |阅读模式
LPC2294的SPI做主机时SSEL是从机选择输出脚,需要外接电阻上拉,这可以理解为OC门,但是如果没有上拉电阻为什么MOSI,SCK也没有输出呢?SSEL上拉后MOSI,SCK立即就有输出。SPI做主机时在PINSEL0中把SSEL选择为IO,其他三个脚选择为SPI功能脚时MOSI,SCK发不出信号,只有选择SSEL为SPI功能脚时才能主机输出(已测试)。<br />这样说SPI做主机难道还要单独用一个IO来作为从机的选择信号吗?那不是要费5根线吗!<br /><br />nxp的例程:&nbsp;LPC2xxx&nbsp;SPI&nbsp;master&nbsp;code&nbsp;example<br />中写道:<br />static&nbsp;void&nbsp;SPI_Init(void)<br />{<br />VICVectAddr0&nbsp;=&nbsp;(unsigned&nbsp;int)&nbsp;&SPI_Isr;<br />VICVectCntl0&nbsp;=&nbsp;0x2A;&nbsp;//&nbsp;Channel0&nbsp;on&nbsp;Source#10&nbsp;...&nbsp;enabled<br />VICIntEnable&nbsp;|=&nbsp;0x400;&nbsp;//&nbsp;10th&nbsp;bit&nbsp;is&nbsp;the&nbsp;SPI<br />IODIR0&nbsp;|=&nbsp;0x00000080;&nbsp;//&nbsp;P0.7&nbsp;defined&nbsp;as&nbsp;SS_DS1722<br />IOCLR0&nbsp;=&nbsp;0x00000080;&nbsp;//&nbsp;SS_DS1722&nbsp;=&nbsp;0<br />PINSEL0&nbsp;|=&nbsp;0x00001500;&nbsp;//&nbsp;configure&nbsp;SPI0&nbsp;pins&nbsp;(except&nbsp;SSEL0)<br />S0SPCCR&nbsp;=&nbsp;12;&nbsp;//&nbsp;SCK&nbsp;=&nbsp;1&nbsp;MHz,&nbsp;counter&nbsp;&gt&nbsp;8&nbsp;and&nbsp;even<br />S0SPCR&nbsp;=&nbsp;0xA8;&nbsp;//&nbsp;CPHA=1,&nbsp;CPOL=0,&nbsp;master&nbsp;mode,&nbsp;MSB&nbsp;first,&nbsp;interrupt&nbsp;enabled<br />}<br /><br />程序里面明明是把SPI0的SSEL0选择为IO的呀,并且是输出,<br /><br />static&nbsp;void&nbsp;DS1722_Write(unsigned&nbsp;char&nbsp;add,&nbsp;unsigned&nbsp;char&nbsp;val)<br />{<br />spiBuf[0]&nbsp;=&nbsp;add;&nbsp;//&nbsp;DS1722&nbsp;address<br />spiBuf[1]&nbsp;=&nbsp;val;<br />msg&nbsp;=&nbsp;spiBuf;<br />count&nbsp;=&nbsp;2;&nbsp;//&nbsp;nr&nbsp;of&nbsp;bytes<br />state&nbsp;=&nbsp;SPI_BUSY;&nbsp;//&nbsp;Status&nbsp;of&nbsp;driver<br />IOSET0&nbsp;=&nbsp;0x00000080;&nbsp;//&nbsp;SS_DS1722&nbsp;=&nbsp;1<br />S0SPDR&nbsp;=&nbsp;*msg;&nbsp;//&nbsp;sent&nbsp;first&nbsp;byte<br />while&nbsp;(state&nbsp;==&nbsp;SPI_BUSY)&nbsp;;&nbsp;//&nbsp;wait&nbsp;for&nbsp;end&nbsp;of&nbsp;transfer<br />IOCLR0&nbsp;=&nbsp;0x00000080;&nbsp;//&nbsp;SS_DS1722&nbsp;=&nbsp;0<br />}<br />中使用SSEL0的IO作为输出来控制从机选通线,<br />我在LPC2294中把<br />PINSEL0&nbsp;|=&nbsp;0x00001500;&nbsp;//&nbsp;configure&nbsp;SPI0&nbsp;pins&nbsp;(except&nbsp;SSEL0)<br />配置为:<br />PINSEL0&nbsp;|=&nbsp;0x00005500;&nbsp;//&nbsp;configure&nbsp;SPI0&nbsp;pins&nbsp;(include&nbsp;SSEL0)<br />spi主机立即就不输出了(SCK,MOSI),<br />设置回去后就可以看到有数据输出了,<br />请知道的解释一下原因,是NXP网站上的例程有问题吗?<br /><br />LPC2294的SPI是不是可以这样理解:<br />1.&nbsp;SSEL选择为SPI功能脚时,无论是做主机还是从机都是输入脚,做主机时需要外部上拉,做从机时由主机驱动;<br />2.&nbsp;做主机时SSEL不能选择为io(好像NXP的例程是设置SSEL为IO!)。我测试时只要把ssel在PINSEL0中选择为IO(其他3个脚仍为SPI功能脚),做主机时SCK,MOSI就没有输出,把SSEL配置改为spi功能脚外部并上拉SCK,MOSI立即就有输出了。<br /><br />谢谢!<br /><br />
ourdoctor 发表于 2007-4-13 16:57 | 显示全部楼层

re:lpc2294

同意你的观点:<br />SSEL应该是和其它几个SPI引脚同时使能才能正常使用SPI功能。<br />SSEL叫从机选择引脚,上拉表示作主机,拉底表示作从机
zlgARM 发表于 2007-4-13 20:53 | 显示全部楼层

ygl_bj

&nbsp;&nbsp;&nbsp;&nbsp;如果将SSEL功能所在的管脚选择为SSEL,而SPI做主机,那么SSEL必须上拉。<br />&nbsp;&nbsp;&nbsp;&nbsp;和OC门没任何关系。
 楼主| ygl_bj 发表于 2007-4-16 08:14 | 显示全部楼层

re: zlg_arm

SPI做主机,只将MISO,MOSI,SCK三个脚选择为SPI功能脚,把SSEL选择为IO,用它做从机的CS控制线可以吗?我实验的结果好像不行,MOSI和SCK没有输出,NXP网站上的例程配置有误吗?<br /><br />LPC2xxx&nbsp;SPI&nbsp;master&nbsp;code&nbsp;example:<br /><br />static&nbsp;void&nbsp;SPI_Init(void)<br />{<br />VICVectAddr0&nbsp;=&nbsp;(unsigned&nbsp;int)&nbsp;&SPI_Isr;<br />VICVectCntl0&nbsp;=&nbsp;0x2A;&nbsp;//&nbsp;Channel0&nbsp;on&nbsp;Source#10&nbsp;...&nbsp;enabled<br />VICIntEnable&nbsp;|=&nbsp;0x400;&nbsp;//&nbsp;10th&nbsp;bit&nbsp;is&nbsp;the&nbsp;SPI<br />IODIR0&nbsp;|=&nbsp;0x00000080;&nbsp;//&nbsp;P0.7&nbsp;defined&nbsp;as&nbsp;SS_DS1722<br />IOCLR0&nbsp;=&nbsp;0x00000080;&nbsp;//&nbsp;SS_DS1722&nbsp;=&nbsp;0<br />PINSEL0&nbsp;|=&nbsp;0x00001500;&nbsp;//&nbsp;configure&nbsp;SPI0&nbsp;pins&nbsp;(except&nbsp;SSEL0)<br />S0SPCCR&nbsp;=&nbsp;12;&nbsp;//&nbsp;SCK&nbsp;=&nbsp;1&nbsp;MHz,&nbsp;counter&nbsp;&gt&nbsp;8&nbsp;and&nbsp;even<br />S0SPCR&nbsp;=&nbsp;0xA8;&nbsp;//&nbsp;CPHA=1,&nbsp;CPOL=0,&nbsp;master&nbsp;mode,&nbsp;MSB&nbsp;first,&nbsp;interrupt&nbsp;enabled<br />}<br /><br />static&nbsp;void&nbsp;DS1722_Write(unsigned&nbsp;char&nbsp;add,&nbsp;unsigned&nbsp;char&nbsp;val)<br />{<br />spiBuf[0]&nbsp;=&nbsp;add;&nbsp;//&nbsp;DS1722&nbsp;address<br />spiBuf[1]&nbsp;=&nbsp;val;<br />msg&nbsp;=&nbsp;spiBuf;<br />count&nbsp;=&nbsp;2;&nbsp;//&nbsp;nr&nbsp;of&nbsp;bytes<br />state&nbsp;=&nbsp;SPI_BUSY;&nbsp;//&nbsp;Status&nbsp;of&nbsp;driver<br />IOSET0&nbsp;=&nbsp;0x00000080;&nbsp;//&nbsp;SS_DS1722&nbsp;=&nbsp;1<br />S0SPDR&nbsp;=&nbsp;*msg;&nbsp;//&nbsp;sent&nbsp;first&nbsp;byte<br />while&nbsp;(state&nbsp;==&nbsp;SPI_BUSY)&nbsp;;&nbsp;//&nbsp;wait&nbsp;for&nbsp;end&nbsp;of&nbsp;transfer<br />IOCLR0&nbsp;=&nbsp;0x00000080;&nbsp;//&nbsp;SS_DS1722&nbsp;=&nbsp;0<br />}<br /><br /><br />
zlgARM 发表于 2007-4-17 21:23 | 显示全部楼层

ygl_bj

不是每一个LPC&nbsp;ARM7&nbsp;CPU的SSEL脚都可以做GPIO。<br />如果您做试验证明该引脚不能做GPIO了,还请你再去看一下数据手册的SPI部分,会有针对SSEL脚的说明的——做一个最后的验证。
 楼主| ygl_bj 发表于 2007-4-18 11:30 | 显示全部楼层

谢谢ZLGARM的解答,试验了,2294的不能做IO.

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

本版积分规则

1

主题

3

帖子

1

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