关于NRF24L01的Linux驱动和s3c2410_getpin();函数问题

downtown 2011-06-04

在调试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
}