主题 : 最近使用Tiny6410的GPE1做DS18B20的驱动,出现S3C64XX_GPEDAT不能写数据 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 94927
精华: 0
发帖: 47
金钱: 240 两
威望: 48 点
综合积分: 94 分
注册时间: 2013-07-28
最后登录: 2016-09-19
楼主  发表于: 2015-05-16 23:23

 最近使用Tiny6410的GPE1做DS18B20的驱动,出现S3C64XX_GPEDAT不能写数据



最近使用tiny6410的核心板CON1中的CON1.3(GPE1)连接DS18B20的DQ数据管脚,做DS18B20的驱动开发,出现无法向GPEDAT写数据;

首先是open函数中使用GPE1对DS18B20进行初始化,初始化函数如下:

/* 相关引脚定义,方便以后移植 */
#define DQ                1
#define CFG_IN        0
#define CFG_OUT    1

static int ds18b20_init(void)
{
    int retval = 0;

    s3c6410_gpio_cfgpin(DQ, CFG_OUT); //置GPE1位输出out

    s3c6410_gpio_setpin(DQ, 1);       //总线状态未知,置总线为高
    udelay(2);
    s3c6410_gpio_setpin(DQ, 0);        // 拉低ds18b20总线,复位ds18b20
    udelay(500);                                       // 保持复位电平500us

    s3c6410_gpio_setpin(DQ, 1);        // 释放ds18b20总线
    udelay(30);

    // 若复位成功,ds18b20发出存在脉冲(低电平,持续60~240us)

    s3c6410_gpio_cfgpin(DQ, CFG_IN);
    retval = s3c6410_gpio_getpin(DQ);

    udelay(500);
    s3c6410_gpio_cfgpin(DQ, CFG_OUT);
    s3c6410_gpio_setpin(DQ, 1);        // 释放总线
    
    return retval;
}

void s3c6410_gpio_cfgpin(unsigned int pin, unsigned int function)
{
               unsigned int tmp;
        tmp = readl(S3C64XX_GPECON);                              
        printk("      : S3C64XX_GPECON = %04x\n", tmp);   //首先打印读取的GPECON
        tmp = (tmp & ~(0xf<<pin*4))|(function<<pin*4);
        printk("      : S3C64XX_GPECON = %04x\n", tmp);   //打印将写入GPECON的值
        writel(tmp, S3C64XX_GPECON);

        
        tmp = readl(S3C64XX_GPECON);                                
        printk("cfgpin: S3C64XX_GPECON = %04x\n", tmp);//再次读取GPECON,与写入GPECON的值作比较
        printk("\n");
}

void s3c6410_gpio_setpin(unsigned int pin, unsigned int dat)
{
        unsigned int tmp;
                tmp = readl(S3C64XX_GPEDAT);
            printk("      : S3C64XX_GPEDAT = %04x\n", tmp);//首先打印读取的GPEDAT
                tmp &= ~(1 << (pin));
                tmp |= ( (dat) << (pin) );
            printk("      : S3C64XX_GPEDAT = %04x\n", tmp); //打印将写入GPEDAT的值
                writel(tmp, S3C64XX_GPEDAT);

            tmp = readl(S3C64XX_GPEDAT);
            printk("setpin: S3C64XX_GPEDAT = %04x\n", tmp);//再次读取GPEDAT,与写入GPEDAT的值作比较
            printk("\n");
}

跟踪打印的数据如下:

置GPE1位输出out:
             S3C64XX_GPECON = 0015  //首先打印读取的GPECON
           : S3C64XX_GPECON = 0015  //打印将写入GPECON的值
cfgpin: S3C64XX_GPECON = 0015  //再次读取GPECON,与写入GPECON的值作比较

//总线状态未知,置总线为高
           : S3C64XX_GPEDAT = 001e  //首先打印读取的GPEDAT
           : S3C64XX_GPEDAT = 001e  //打印将写入GPEDAT的值
setpin: S3C64XX_GPEDAT = 001e  //再次读取GPEDAT,与写入GPEDAT的值作比较

// 拉低ds18b20总线,复位ds18b20
           : S3C64XX_GPEDAT = 001e  //首先打印读取的GPEDAT
           : S3C64XX_GPEDAT = 001c  //打印将写入GPEDAT的值
setpin: S3C64XX_GPEDAT = 001e  //再次读取GPEDAT,与写入GPEDAT的值作比较

从打印的信息追踪到拉低ds18b20总线,复位ds18b20,让GPE1的GPEDAT输出0,拉低总线,即写入001c  ,结果再次读出来的是001e  

楼主,请问这个问题是怎么回事??
[ 此帖被i_thinker在2015-05-17 13:23重新编辑 ]