ds18b20的一点疑惑
以下是DS18b20的程序,我用的芯片是at91sam7s64,发现有些IO可以用,有些IO不行,比如我用PA0是可以正确读数的,但是用PA15读数一直是0,请问是怎么回事呢?AT91S_PIO * pPIO = AT91C_BASE_PIOA;
void DS18b20_Init(void)
{
pPIO->PIO_PER = DS18B20;
pPIO->PIO_PPUDR = DS18B20;
}
//*-------------------------------------------------
//* Function Name: Reset_Ds18b20
//* Object: Reset Ds18b20
//* Input Parameters:none
//* Output Parameters:none
//*-------------------------------------------------
void Reset_Ds18b20(void)
{
SET_DIR_1WIRE;
SET_OP_1WIRE;
_delay_us(1);
CLR_OP_1WIRE;
_delay_us(600); //480usÒÔÉÏ
SET_OP_1WIRE;
CLR_DIR_1WIRE;
_delay_us(20); //15~60us
while(CHECK_IP_1WIRE);//* Ϊ±ÜÃâËÀÑ­Ðò£¬´ý´¦Àí
SET_DIR_1WIRE;
SET_OP_1WIRE;
_delay_us(140); //60~240us
}
//*-------------------------------------------------
//* Function Name: Write_Ds18b20
//* Object: Write a byte
//* Input Parameters:none
//* Output Parameters:none
//*-------------------------------------------------
void Write_Ds18b20(unsigned char x)
{
unsigned char m;
for(m=0; m<8; m++)
{
CLR_OP_1WIRE;
if(x&(1<<m))
SET_OP_1WIRE;
else
CLR_OP_1WIRE;
_delay_us(50); //15~60us
SET_OP_1WIRE;
_delay_us(1);
}
SET_OP_1WIRE;
}
//*-------------------------------------------------
//* Function Name: Read_Ds18b20
//* Object: Read a byte
//* Input Parameters:none
//* Output Parameters:none
//*-------------------------------------------------
unsigned char Read_Ds18b20(void)
{
unsigned char temp,k,n;
temp=0;
for(n=0; n<8; n++)
{
CLR_OP_1WIRE;
SET_OP_1WIRE;
CLR_DIR_1WIRE;
_delay_us(2);
k =(CHECK_IP_1WIRE);
if(k)
temp|=(1<<n);
else
temp&=~(1<<n);
_delay_us(70); //60~120us
//
SET_DIR_1WIRE;
_delay_us(1);
}
return (temp);
}
//*-------------------------------------------------
//* Function Name: Get_Temp
//* Object: Read tempture from ds18b20
//* Input Parameters:none
//* Output Parameters:none
//*-------------------------------------------------
float Get_Temp(void)
{
unsigned char temh,teml;
float temp;
unsigned int tmp;
Reset_Ds18b20();
Write_Ds18b20(skiprom);
Write_Ds18b20(convert);
_delay_ms(100);
_delay_ms(100);
Reset_Ds18b20();
Write_Ds18b20(skiprom);
Write_Ds18b20(readscrat);
teml = Read_Ds18b20();
temh = Read_Ds18b20();
tmp = temh;
tmp <<= 8;
tmp |= teml;
temp = tmp*0.0625+0.005;
return temp;
} 是不是你的IO设置了别的功能? 回复【1楼】gooogleman 谷歌汉子
-----------------------------------------------------------------------
没有,
void DS18b20_Init(void)
{
pPIO->PIO_PER = DS18B20;
pPIO->PIO_PPUDR = DS18B20;
}
初始化使能IO了,外设禁用了的 我直接控制IO的时候有电平变化,但是用来驱动ds18b20就不行了,是不是时序上有问题呢 回复【楼主位】snailchen 箫寒客
-----------------------------------------------------------------------
楼主,我也是用AT91SAM64控制18B20,请问下,为什么忙标志一直读回来是1呢?我换了好多口都是1,请问是不是在其他地方要设置什么啊?
下面是我的程序,您帮我看下好吗?
uint32 Init_DS18B20(void)//18B20初始化
{
uint32 x;
*AT91C_PIOA_OER|=BIT0;//IO方向为输出
//*AT91C_PIOA_PER|=BIT0;//PIO控制
SET_DS; //DQ置高
delay_nus(1);//稍做延时
CLR_DS; //将DQ拉低
delay_nus(750); //精确延时 大于 480us
SET_DS; //拉高总线
delay_nus(80);
*AT91C_PIOA_ODR|=BIT0;//IO方向为输入,方便读取数据
*AT91C_PIOA_PER|=BIT0;// 禁止PIO控制
delay_nus(100);
x=(*AT91C_PIOA_PDSR&0x00000001);
*AT91C_PIOA_OER|=BIT0;//IO方向为输出
SET_DS; //DQ置高
delay_nus(140);
return(x);
}} mark! 4楼的这样很难检测到存在脉冲了。你可能没了解“脉冲”这个词!
页:
[1]