NIOS II软件编写的DS18B20采温程序不能正常采集,求大神指点。
时间:10-02
整理:3721RD
点击:
sopc搭建方面:
这边添加了一个Bidir类型的PIO口,名称为JP2_0。base值为0x800030。
NIOS II 软件编写方面:
以下程序根据DS18B20例程编写:
--------------------------------------------------------
void init_18b20() //初始化18b20
{
alt_u8 n;
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE,1); //初始状态高电平
usleep(20);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE,0); //拉低
usleep(600);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE,1); //释放总线
usleep(40);
n=IORD_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE);
usleep(150);
}
void write_18b20(alt_u8 dat)
{
alt_u8 i;
for(i=0;i >=1;
}
usleep(100);
}
alt_u8 read_18b20()
{
alt_u8 i;
alt_u8 value;
for(i=0;i >=1;
usleep(5);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE,1);
usleep(5);
if(IORD_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE))
value|=0x80;
usleep(20);
}
return value;
}
alt_u8 read_tem()
{
alt_u8 a,b;
alt_u16 temp;
init_18b20(); //初始化
write_18b20(0xcc); //跳过ROM
write_18b20(0x44); //启动采样
usleep(1000);
init_18b20();
write_18b20(0xcc);
write_18b20(0xbe);
a=read_18b20(); //采低8位
b=read_18b20(); //采高8位
temp=b DIRECTION=1;JP2_0->DATA=1; //初始状态高电平
usleep(20);
JP2_0->DIRECTION=1;JP2_0->DATA=0; //拉低
usleep(600);
JP2_0->DIRECTION=1;JP2_0->DATA=1; //释放总线
usleep(200);
JP2_0->DIRECTION=0;
n=JP2_0->DATA;
usleep(600);
usleep(150);
return n;
}
void write_18b20(alt_u8 dat)
{
alt_u8 i;
for(i=0;i DIRECTION=1;JP2_0->DATA=1;
usleep(5);
JP2_0->DIRECTION=1;JP2_0->DATA=0;
usleep(5);
JP2_0->DIRECTION=1;JP2_0->DATA=dat&0x01;
usleep(100);
JP2_0->DIRECTION=1;JP2_0->DATA=1;
dat>>=1;
}
usleep(100);
}
alt_u8 read_18b20()
{
alt_u8 i;
alt_u8 value;
for(i=0;i DIRECTION=1;JP2_0->DATA=1;
usleep(5);
JP2_0->DIRECTION=1;JP2_0->DATA=0;
value>>=1;
usleep(5);
JP2_0->DIRECTION=1;JP2_0->DATA=1;
usleep(5);
JP2_0->DIRECTION=0;
if(JP2_0->DATA)
value|=0x80;
usleep(20);
}
return value;
}
alt_u8 read_tem()
{
alt_u8 a,b;
alt_u16 temp;
init_18b20(); //初始化
write_18b20(0xcc); //跳过ROM
write_18b20(0x44); //启动采样
usleep(1000);
init_18b20();
write_18b20(0xcc);
write_18b20(0xbe);
a=read_18b20(); //采低8位
b=read_18b20(); //采高8位
temp=b<<8; //高八位右移8位
temp=temp+a;
temp=temp*0.0625;
return temp;
}
又换了结构体的方式写,结果还是一样
这边添加了一个Bidir类型的PIO口,名称为JP2_0。base值为0x800030。
NIOS II 软件编写方面:
以下程序根据DS18B20例程编写:
--------------------------------------------------------
void init_18b20() //初始化18b20
{
alt_u8 n;
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE,1); //初始状态高电平
usleep(20);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE,0); //拉低
usleep(600);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE,1); //释放总线
usleep(40);
n=IORD_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE);
usleep(150);
}
void write_18b20(alt_u8 dat)
{
alt_u8 i;
for(i=0;i >=1;
}
usleep(100);
}
alt_u8 read_18b20()
{
alt_u8 i;
alt_u8 value;
for(i=0;i >=1;
usleep(5);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE,1);
usleep(5);
if(IORD_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE))
value|=0x80;
usleep(20);
}
return value;
}
alt_u8 read_tem()
{
alt_u8 a,b;
alt_u16 temp;
init_18b20(); //初始化
write_18b20(0xcc); //跳过ROM
write_18b20(0x44); //启动采样
usleep(1000);
init_18b20();
write_18b20(0xcc);
write_18b20(0xbe);
a=read_18b20(); //采低8位
b=read_18b20(); //采高8位
temp=b DIRECTION=1;JP2_0->DATA=1; //初始状态高电平
usleep(20);
JP2_0->DIRECTION=1;JP2_0->DATA=0; //拉低
usleep(600);
JP2_0->DIRECTION=1;JP2_0->DATA=1; //释放总线
usleep(200);
JP2_0->DIRECTION=0;
n=JP2_0->DATA;
usleep(600);
usleep(150);
return n;
}
void write_18b20(alt_u8 dat)
{
alt_u8 i;
for(i=0;i DIRECTION=1;JP2_0->DATA=1;
usleep(5);
JP2_0->DIRECTION=1;JP2_0->DATA=0;
usleep(5);
JP2_0->DIRECTION=1;JP2_0->DATA=dat&0x01;
usleep(100);
JP2_0->DIRECTION=1;JP2_0->DATA=1;
dat>>=1;
}
usleep(100);
}
alt_u8 read_18b20()
{
alt_u8 i;
alt_u8 value;
for(i=0;i DIRECTION=1;JP2_0->DATA=1;
usleep(5);
JP2_0->DIRECTION=1;JP2_0->DATA=0;
value>>=1;
usleep(5);
JP2_0->DIRECTION=1;JP2_0->DATA=1;
usleep(5);
JP2_0->DIRECTION=0;
if(JP2_0->DATA)
value|=0x80;
usleep(20);
}
return value;
}
alt_u8 read_tem()
{
alt_u8 a,b;
alt_u16 temp;
init_18b20(); //初始化
write_18b20(0xcc); //跳过ROM
write_18b20(0x44); //启动采样
usleep(1000);
init_18b20();
write_18b20(0xcc);
write_18b20(0xbe);
a=read_18b20(); //采低8位
b=read_18b20(); //采高8位
temp=b<<8; //高八位右移8位
temp=temp+a;
temp=temp*0.0625;
return temp;
}
又换了结构体的方式写,结果还是一样
已退回1积分