完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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<8;i++) { IOWR_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE,1); usleep(5); IOWR_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE,0); usleep(5); IOWR_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE,dat&0x01); usleep(100); IOWR_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE,1); dat>>=1; } usleep(100); } alt_u8 read_18b20() { alt_u8 i; alt_u8 value; for(i=0;i<8;i++) { IOWR_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE,1); usleep(5); IOWR_ALTERA_AVALON_PIO_IRQ_MASK(JP2_0_BASE,0); value>>=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<<8; //高八位右移8位 temp=temp+a; temp=temp*0.0625; return temp; } --------------------------------------------------------------------------- 现在遇到的问题是,用断点测试,在初始化中得到的n的值为n=0x10000000,然后在read_18b20()函数采样中一直采到的是从0, 0x1,0x11,0x111一直到0x1111111,也就是说每次采到的值都是1。这样使得后面测温环节采到的高8位和低8位都是0xff,导致最后结果很离谱。 请问各位高手,现在问题是出在了哪一步呢?是在硬件搭建中出错了(我认为好像是DS18B20根本没有与IO口接通,可是我仔细检查SOPC软核,又换了好几块18B20都是不行),还是代码哪里有问题。 小白现在在很用心的做自己的毕设,但是由于这个问题卡了自己三天,不得已来论坛求助,希望各位大神帮忙解答,感激不尽。如果有好心大神远程协助就更好了。谢谢大家。 补充内容 (2016-4-19 14:32): 求各位大神指点 补充内容 (2016-4-19 17:20): alt_u8 init_18b20() //初始化18b20 { alt_u8 n=0; JP2_0->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<8;i++) { JP2_0->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<8;i++) { JP2_0->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; } 又换了结构体的方式写,结果还是一样
|
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
764 浏览 0 评论
矩阵4x4个按键,如何把识别结果按编号01-16(十进制)显示在两个七段数码管上?
974 浏览 0 评论
863 浏览 0 评论
1849 浏览 0 评论
474 浏览 0 评论
1281 浏览 28 评论
5467 浏览 113 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-9 05:38 , Processed in 0.575985 second(s), Total 71, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号