s3c2410_gpio_getpin函数问题

  在调试NRF24L01Linux驱动时,发送程序调试的很顺利,但是接收驱动一直有问题。最后确定S3C2440通过SPI接口读取NRF24L01时的MISO存在问题,问题集中在tmp |= MISO_STU;
  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对应的bit0,非0表示该bit1。所以对于s3c2410_gpio_getpin(S3C2410_GPG(9)),如果GPG9为低电平则返回的是0,如果是高电平则返回的是GPxDAT中的GPG9对应位的值为0x0100而不是0x0001。修改tmp |= MISO_STU;如下:

if ( MISO_STU ) {
    tmp |= 0x01;
}

修改后的SPI读写程序如下:

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 ) { /* capture current MISO bit */
            tmp |= 0x01;
        }

        SCK_L; /* then set SCK low again */
        ndelay ( 60 );
    }

    return ( tmp ); /* return read tmp */
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值