关于NRF24L01的Linux驱动和s3c2410_getpin();函数问题
在调试NRF24L01的linux驱动的时候,发送程序调试的很顺利,可以通过2440控制NRF24L01发送数据,并且能够通过MSP430控制NRF24L01正确的接收数据,但是接收驱动一直有问题,前两天调试到凌晨2点多,很是郁闷,找出NRF24L01的datasheet以及对应的MSP430驱动NRF24L01的接收和发送程序,搞了很长时间,因为可以正常发送,却没有接收到数据,最后确定2440通过SPI接口读取NRF24L01时的MISO存在问题,问题集中在
tmp |= MISO_STU; // capture current MISO bit
其中MSIO_STU定义为:
#define MISO_STU s3c2410_gpio_getpin(S3C2410_GPG(9)) //读取GPIO状态
其中s3c2410_gpio_getpin函数原型为:
unsigned int s3c2410_gpio_getpin(unsigned int pin)
{
void __iomem *base = S3C24XX_GPIO_BASE(pin);
unsigned long offs = S3C2410_GPIO_OFFSET(pin);
return __raw_readl(base + 0x04) & (1<< offs);
}
s3c2410_gpio_getpin()的返回值是GPxDAT寄存器的值与所要读取的GPIO对应的bit mask相与以后的值,0表示该GPIO对应的bit为0, 非0表示该bit为1,所以s3c2410_gpio_getpin(S3C2410_GPG(9))如果GPG9为低电平则返回的是0,如果是高电平则返回的是GPxDAT中的GPG9对应位的值为0x0100而不是0x0001,查处问题后修改也很简单了。
修改:
tmp |= MISO_STU;
为:
if(MISO_STU)
tmp |= 0x01 ;
即可。
昨天网上虽然确定了tmp |= MISO_STU;有问题,但是在修改代码的时候由于粗心把代码写成了
if(MISO_STU); //注意此处多加了一个“;”
tmp |= 0x01 ;
导致读取SPI寄存器一直为0xFF,一直到凌晨2点多也没搞定,今天终于查出了这个bug,修改后终于可以正确的接收数据了,在看到打印出接收数据的时候感觉就是爽。
修改后的SPI读写程序如下:
//函数:uint8 SPI_RW(uint8 tmp)
//功能:NRF24L01的SPI写时序tmp
uint8 SPI_RW(uint8 tmp)
{
uint8 bit_ctr;
for(bit_ctr=0 ;bit_ctr<8 ;bit_ctr++) // output 8-bit
{
if(tmp & 0x80) // output 'tmp', MSB to MOSI
MOSI_H;
else
MOSI_L;
tmp <<= 1; // shift next bit into MSB..
SCK_H; // Set SCK high..
ndelay(60);
if(MISO_STU) //tmp |= MISO_STU; // capture current MISO bit
tmp |= 0x01 ;
SCK_L; // ..then set SCK low again
ndelay(60);
}
return(tmp); // return read tmp
}