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立即就有输出了。
谢谢!
|