打印
[ZLG-ARM]

LPC2294的SPI做主机时SSEL的问题!

[复制链接]
3029|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功能脚时才能主机输出(已测试)。
这样说SPI做主机难道还要单独用一个IO来作为从机的选择信号吗?那不是要费5根线吗!

nxp的例程: LPC2xxx SPI master code example
中写道:
static void SPI_Init(void)
{
VICVectAddr0 = (unsigned int) &SPI_Isr;
VICVectCntl0 = 0x2A; // Channel0 on Source#10 ... enabled
VICIntEnable |= 0x400; // 10th bit is the SPI
IODIR0 |= 0x00000080; // P0.7 defined as SS_DS1722
IOCLR0 = 0x00000080; // SS_DS1722 = 0
PINSEL0 |= 0x00001500; // configure SPI0 pins (except SSEL0)
S0SPCCR = 12; // SCK = 1 MHz, counter > 8 and even
S0SPCR = 0xA8; // CPHA=1, CPOL=0, master mode, MSB first, interrupt enabled
}

程序里面明明是把SPI0的SSEL0选择为IO的呀,并且是输出,

static void DS1722_Write(unsigned char add, unsigned char val)
{
spiBuf[0] = add; // DS1722 address
spiBuf[1] = val;
msg = spiBuf;
count = 2; // nr of bytes
state = SPI_BUSY; // Status of driver
IOSET0 = 0x00000080; // SS_DS1722 = 1
S0SPDR = *msg; // sent first byte
while (state == SPI_BUSY) ; // wait for end of transfer
IOCLR0 = 0x00000080; // SS_DS1722 = 0
}
中使用SSEL0的IO作为输出来控制从机选通线,
我在LPC2294中把
PINSEL0 |= 0x00001500; // configure SPI0 pins (except SSEL0)
配置为:
PINSEL0 |= 0x00005500; // configure SPI0 pins (include SSEL0)
spi主机立即就不输出了(SCK,MOSI),
设置回去后就可以看到有数据输出了,
请知道的解释一下原因,是NXP网站上的例程有问题吗?

LPC2294的SPI是不是可以这样理解:
1. SSEL选择为SPI功能脚时,无论是做主机还是从机都是输入脚,做主机时需要外部上拉,做从机时由主机驱动;
2. 做主机时SSEL不能选择为io(好像NXP的例程是设置SSEL为IO!)。我测试时只要把ssel在PINSEL0中选择为IO(其他3个脚仍为SPI功能脚),做主机时SCK,MOSI就没有输出,把SSEL配置改为spi功能脚外部并上拉SCK,MOSI立即就有输出了。

谢谢!

相关帖子

沙发
ourdoctor| | 2007-4-13 16:57 | 只看该作者

re:lpc2294

同意你的观点:
SSEL应该是和其它几个SPI引脚同时使能才能正常使用SPI功能。
SSEL叫从机选择引脚,上拉表示作主机,拉底表示作从机

使用特权

评论回复
板凳
zlgARM| | 2007-4-13 20:53 | 只看该作者

ygl_bj

    如果将SSEL功能所在的管脚选择为SSEL,而SPI做主机,那么SSEL必须上拉。
    和OC门没任何关系。

使用特权

评论回复
地板
ygl_bj|  楼主 | 2007-4-16 08:14 | 只看该作者

re: zlg_arm

SPI做主机,只将MISO,MOSI,SCK三个脚选择为SPI功能脚,把SSEL选择为IO,用它做从机的CS控制线可以吗?我实验的结果好像不行,MOSI和SCK没有输出,NXP网站上的例程配置有误吗?

LPC2xxx SPI master code example:

static void SPI_Init(void)
{
VICVectAddr0 = (unsigned int) &SPI_Isr;
VICVectCntl0 = 0x2A; // Channel0 on Source#10 ... enabled
VICIntEnable |= 0x400; // 10th bit is the SPI
IODIR0 |= 0x00000080; // P0.7 defined as SS_DS1722
IOCLR0 = 0x00000080; // SS_DS1722 = 0
PINSEL0 |= 0x00001500; // configure SPI0 pins (except SSEL0)
S0SPCCR = 12; // SCK = 1 MHz, counter > 8 and even
S0SPCR = 0xA8; // CPHA=1, CPOL=0, master mode, MSB first, interrupt enabled
}

static void DS1722_Write(unsigned char add, unsigned char val)
{
spiBuf[0] = add; // DS1722 address
spiBuf[1] = val;
msg = spiBuf;
count = 2; // nr of bytes
state = SPI_BUSY; // Status of driver
IOSET0 = 0x00000080; // SS_DS1722 = 1
S0SPDR = *msg; // sent first byte
while (state == SPI_BUSY) ; // wait for end of transfer
IOCLR0 = 0x00000080; // SS_DS1722 = 0
}


使用特权

评论回复
5
zlgARM| | 2007-4-17 21:23 | 只看该作者

ygl_bj

不是每一个LPC ARM7 CPU的SSEL脚都可以做GPIO。
如果您做试验证明该引脚不能做GPIO了,还请你再去看一下数据手册的SPI部分,会有针对SSEL脚的说明的——做一个最后的验证。

使用特权

评论回复
6
ygl_bj|  楼主 | 2007-4-18 11:30 | 只看该作者

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

同上

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

1

粉丝