这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 头文字D的CPLD_DIY进程帖

共15条 2/2 1 2 跳转至
助工
2013-06-16 22:17:08     打赏
11楼

串口篇

      串口在单片机调试中也算是调试代码的利器,可是以前单片机基本上都有串口,我们所要做的无非就是把要发送的数据写给某一寄存器,然后等他发完就OK啦,接收也是同样的道理,那时候的我虽然经常在用串口,但是对串口还是没有真正的理解,波特率?起始停止位?奇偶校验位?统统只要配置寄存器。学到FPGA就不一样啦,啥也没有,我想这也正体现了FPGA的灵活性嘛。现在我们要开始模拟串口时序啦。

      我将工程分为四个模块:波特率发生器,串口接收,串口发送。

      模块1(波特率发生器):什么是波特率呢?波特率就是每秒发送/接收位(bit)的个数,比如1s发2个字节,1个字节8bit,那么波特率就是16,一般串口都用9600,115200啥的,说到这里,大家都应该知道了,这个模块其实就是一个分频器罢了,如果要9600的波特率,那么只要将频率为50M的时钟分成频率为9600*8Hz就好啦,大家会说,乘以8做啥呀,一会儿后面说。

      模块2(串口接收):首先判断第一位是不是“0”(不要问我为什么,这是串口协议规定,起始位为0),若为0,则开始判断接下来8位的值,这8位才是真正的数据,8位数据判断完了,再判断奇偶校验位(如果发送方有的话),最后“判断”停止位,说是判断,其实谁关心停止位是啥呀,你说是吧,说白了就是给它面子,让时间流过停止位而已。但是呢,你要按我说的做呢,十有八九在串口调试助手里是木有结果的,为什么呢?这里要说说模块1中的“乘以8”,其实在判断每一位时,我们都要判断8次,取值呢就取8次判断中出现次数超过半数的1”或“0”,这样能更好的抗干扰能力,嘿嘿,这样就算成功了一大半啦。

      模块3(串口发送):发送要比接收简单多了,毕竟主动权在自己手中呀,同样的,也要发送“起始位+数据位+奇偶校验位(有的话)+停止位”,这里每一位要保持8个周期哦,因为波特率是9600*8呀。

      整个工程的功能呢就是将串口接收的数据再发回串口调试助手。

     视频观看:


视频地址:http://union.bokecc.com/flash/single/290666218ACBA694_F130E91EDB6302FF9C33DC5901307461_false_EEA982EE6B20F4D1_1/player.swf


助工
2013-06-16 22:17:43     打赏
12楼

LM75使用

     看见群里一直有人问这个芯片肿么焊,我是这样焊的,板子正对着自己,芯片倒着放,芯片上的字是反着的。这样焊,芯片工作正常,读出的数据也很完美,你值得一试。

     这款芯片怎么说呢,知名度没有DS18b20高,谁让别人是单总线这么个新鲜玩意呢。理论上说一条IIC总线上可挂接8个LM75,这样的规定地址和24C0X系列一样,言归正传,看看FPGA是怎么样模拟IIC总线的呢。

     首先咱们打开LM75数据手册LM75.pdf,看到SCL的周期最小到2.5us,也就是说,IIC的操作频率不能高于400KHz,这速度可比串口快多了哈,我这里用的是100KHz,同理,写了一个分频器。然后我将一个周期分成4个部分,分别是“上升沿”、“高电平中心”、“下降沿”、“低电平中心”(这里参考了网上默默奉献的大牛们的思路,在此表示非常的感谢,是你们带领我们这些菜鸟进步),“上升沿”对应的计数值到来时,SCL=1,“下降沿”对应的计数值到来时,SCL=0,这样SCL就一直在工作了,不仅如此,众所周知,sda在SCL上升沿时锁存信号,这时,我们可以每次在SCL在“低电平中心”时送sda数据,这样的话,SCL上升沿的时候,sda数据必定是稳定的,至于为什么要在低电平中心呢?我想可能中心点的SCL有比较稳定的电平(相比在上升沿会有上升时间或波动啥的),这里希望大牛们能给我们指点一些迷津。

     底层工作做好啦,下面就是搭建上层建筑,包括起始时序、写时序、(从机、主机)应答时序、停止时序、读时序,这些可以从24C02的数据手册里看到24c02串行储存器中文官方资料手册.pdf

     知道了以上这些时序呢,最后就是先发啥指令,再发啥指令。。。。。。我是这样的:

     1. 写指令:0x90,这是写器件地址,意思就是我选你了。

     2. 写温度寄存器地址:0x00,这是存温度值的寄存器,即写入要读的寄存器的地址。

     3. 结束一个写周期

     4. 重新开始,写指令:0x91,这是读器件地址。

     5. 读16位温度值(其实就前8位是有效的),记住:每读8位温度值,主机要给LM75一个应答,最后一个字节读完,主机来一个非应答(用完了就不管别人死活)然后停止。

     注意:每次应答的时候我都是象征性的跳过一个SCL周期,以前死磕着判断sda是否为低,最后程序就一直循环着死磕,可能从机都应答完了,你没采到值罢了;sda未使用或者作为input使用时最好将其设置为高阻态。

     特别注意:由于读出的温度值要分离出十位和个位,我们自然而然的想到用“/”和“%”,之前一直使用的ISE,FPGA不支持除法,ISE也不支持,得自己添加核。早就听闻Quartus比较人性化,编译的时候自动添加除法和取模的核,我自然而然的跃跃欲试,综合一下,果然自动添加核,令我兴奋不已,可是却显示使用了300多个逻辑门,而这款CPLD却只有240(单位不知道是什么呀),一看两个核用了100多逻辑门,心里顿时拔凉拔凉的,无奈,还是用了老办法:case语句罗列出所有可能性,大神们有什么更可行的方案不?咱们可以交流交流。

     还有,IIC时序控制我全部使用的是状态机来控制的,使得程序十分累赘,但自己读起来比较好理解,想请教一下大神们有什么好办法不?

     视频观看:


视频地址:http://union.bokecc.com/flash/single/290666218ACBA694_9A8226AA2B78F0C39C33DC5901307461_false_EEA982EE6B20F4D1_1/player.swf


助工
2013-06-27 21:38:44     打赏
13楼

LCD1602篇

    1602的时序还是比较简单的,因为它是并口传输,然后在en为1的时候发送要写入1602的数据就行啦,至于还有rs,rw两个脚,那只是规定要读/写数据还是命令,是读还是写,无关时序啥事。

    首先:分频!因为1602的“反应”速度比较慢,我分频至500Hz,2ms写一次指令或数据,en就是这个时钟,写指令或显示数据时,让en以500Hz工作,不写指令时使en为0。

    然后就是送各种命令,我送的是:0x01->0x38->0x0c->0x06,具体的意思呢,可以参考一下1602手册1602液晶说明.pdf

    接着呢,写你想要显示的数据的地址,我写的是0x81,然后就是一个一个写数据:“A”,“B”“C”,“D”.......注意哦,地址只要写一次就行了,就是写首地址,因为指令0x06会自动加指令指针。

    1602显示有个好处,你不需要定期去刷新,除非你想更新它的显示


助工
2013-06-27 22:06:55     打赏
14楼

LM75+1602显示

    这个实验涉及到1602显示更新的问题,原本是想显示“T=30℃”,但是却显示成“T==30”,思前想后,不得要领,最后发现了症结:不写入显示字符时,en仍在以500Hz的频率工作着,而一旦en为高电平时,就将[7:0]data并口上的数据写入1602RAM中,并使RAM指针加1,所以在不写显示字符时,一定要让en置0。

    不知道使我的代码冗余太多了,编译后用了239逻辑门,总共才240逻辑门(单位不太清楚),通过这个程序知道了PCLD资源确实有点少。

    视频观看:


视频地址:http://union.bokecc.com/flash/single/290666218ACBA694_7D483A59D1F8DA0B9C33DC5901307461_false_EEA982EE6B20F4D1_1/player.swf


助工
2013-06-27 22:29:47     打赏
15楼

共15条 2/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]