





最近使用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重新编辑 ]