这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » Xilinx » 最近忙活了一块Xilinx开发板,把遇到的问题在这整理一下吧

共23条 2/3 1 2 3 跳转至
工程师
2013-04-03 11:33:57     打赏
11楼

这回说说IIC接口吧。

IIC接口可以说是最简单的总线协议了。SCL和SDA两根线就组成了一个总线,可以连接多个主机从机,通过简单的协议控制总线占用。在实际使用过程中经常作为芯片的配置接口。芯片的寄存器配置初始化设置多采用IIC接口或者稍有改进的IIC接口。虽然是一个简单的接口,功能也很简单,不过要注意的东西也有一些。

 

很多参考设计里IIC总线的上拉电阻是4.7K。为什么选择这个阻值呢?

IIC的两根总线信号都是开漏输出,器件本身只输出低电平,高电平需要外部的上拉电阻实现。上拉电阻阻值的大小决定了驱动电流的大小,如果上拉电阻的阻值过小,比如100欧姆,假设3V的系统电压,驱动电流就会有30mA,这么大的电流很容易损坏端口。相反,上拉电阻阻值过大又可能驱动能力不够。

除了驱动能力考虑意外,还有一个信号上升时间的考虑。在信号从低变高的过程中,上拉电阻和线上电容组成了一个等效的RC电路,上升时间近似等于上拉电阻和线上电容的乘积。线上电容包括引脚电容,器件电容,信号线上电容等等。这些因素是我们比较难控制的。那么我们可以通过改变上拉电阻来简单的控制总线上信号的上升时间。4.7k电阻基本上能满足绝大部分IIC速率和实际设计的要求。

当然最后一个原因就是成本。上拉电阻选取本身就是一个范围,4.7K是一个中值,另外也是标准电阻,经济实惠量又足,不需要买百分之一精度的电阻。

 

在一些特殊的设计场合,如总线上连接的器件较多,总线布线较长或者IIC的高速应用等情况下,我们可以适当的减小上拉电阻的选择,如2.2K,1.5K等等,减少信号的上升时间,以适应设计的要求。

 


工程师
2013-04-03 11:54:46     打赏
12楼

把FPGA当空气

提到IIC接口,说说本次设计里遇到的一个小问题。

本次的FPGA板上有多个接口芯片需要初始化配置,因此板上预留了一个MCU用来做控制。从板子的结构考虑,把接口芯片和MCU的IIC总线都连到了FPGA上。把FPGA当成透明的连接线,把MCU和接口芯片的IIC总线连接在一起。

开始想的比较简单,在FPGA内部把几根线连起来不就行了。但是细想起来还真不是这么简单。

如果信号是简单的输入或者输出,单向信号,用FPGA把两根信号先在内部连起来是非常简单可靠的。但是IIC的两根信号线不是简单的输入或者输出,SDA信号是双向的(总线协议里SCL也是双向信号,在多个主机的时候有判决作用,这次的应用只有一个主机,所以SCL可以看成是单向的,主机发送,从机接收)。在每次的读写操作时,主机发送控制指令,从机都要反馈ACK信号给主机。而双向信号在FPGA里就不能这么简单的连接起来了。怎么解决呢。

 

分析一下IIC总线信号。IIC总线都是开漏的,也就是本身只发送低电平,高电平是通过上拉电阻实现的。也就是说,无论主机从机,只有在输出低电平的时候才会往总线上发送信号,其他情况下总线都是被上拉电阻上拉到高电平。无论主机从机,只要有一个设备往总线上发送出低电平,如果是用线连接,其他设备就会同时收到这个低电平信号。现在我们就要在FPGA内部模拟总线上的这种情况。

 

具体实现。所有的SDA设为输入输出口,一般情况下,禁用信号线的输出。检测每根信号线的输入。当有一根信号线为低时,使能其他信号线的输出,禁用输入,然后把其他信号线拉低。当检测到上升沿时,恢复到初始状态,禁用输出,检测输入。如此反复。也就是一旦检测到低电平,就把其他信号线拉低。检测到上升沿,就把状态恢复,继续检测低电平。

实际系统测试,效果良好,一个主机控制四个从机没压力。由于这次的应用是单主机的形式,如果有多个主机还会复杂些,要加上SCL的判断,不过原理是一样的。

没想到要把FPGA当空气也不是这么容易的。


高工
2013-04-06 12:54:07     打赏
13楼
确实,但为啥一定要经过FPGA呢?

院士
2013-04-06 16:19:44     打赏
14楼
楼主可有阵子没见了

工程师
2013-04-06 16:56:04     打赏
15楼
感谢楼主分享经验,学习之

工程师
2013-04-07 09:35:49     打赏
16楼

着实忙活了一阵子,呵呵,最近抽出空来可以多上上论坛啦,给论坛添砖加瓦吧


工程师
2013-04-07 14:06:27     打赏
17楼
和板子的具体结构有关系,另外接口芯片除了MCU控制以外,也需要FPGA直接配置,所以就都连接到FPGA里面了

工程师
2013-04-07 16:40:11     打赏
18楼

单片机

 

板上预留了一颗silicon labs的小MCU,C8051F380.选型并没有特殊的考虑,只是手头上正好有几颗芯片。预留MCU实现和PC上位机的串口通信。上位机可以通过MCU的串口访问板上资源,以及配置FPGA逻辑,芯片寄存器参数设置等等。

用到的MCU资源比较简单,就是UART,IIC和一些GPIO。毕业到现在做过DSP,ARM,FPGA等等,MCU还真是第一次做。上手的感觉就是充分利用好芯片公司提供的例程,加速项目研发进度。silicon labs提供了芯片各个接口的测试例程。可移植性好,提供的程序都能在板子上直接运行。

根据项目需求,参考UART例程,很方便的和PC机建立串口连接。通过解析串口指令,执行不同的操作。完成初始化配置,寄存器修改,数据读取,EEPROM读写等等操作。 忍不住吐槽一下,MCU的资源确实挺有限,开始定义全局变量的时候没考虑这么多,结果程序怎么都编译不通过,原来是资源不够了。后面对程序又做了很大的修改。在单片机的变成方面,资源还是要好好考虑的事情,少用全局变量。

程序调试方面还是比较顺利的,其中并没有遇到太大的问题。只是在一些寄存器的配置方面要注意,多读芯片的datasheet,清楚寄存器的具体应用,大部分寄存器的每个bit都有不同的功能。因此在给寄存器赋值的时候最好只修改你要改变的某一位或者某几位。而不是简单的给寄存器直接赋值。养成好习惯,不至于程序复杂的时候不好查找问题。

 


工程师
2013-04-07 19:01:37     打赏
19楼

上位机

 

这块板子用到的PC端上位机其实就是一个简易版的串口调试助手。用VB写起来比较简单。VB用起来比较傻瓜,上手快,功能也都比较直观。只是要把程序做的健壮还是有些小细节要考虑到。

添加serialport控件来支持串口就好了。

串口建立连接的时候要判断串口是否存在或者是否被占用。可以用try/catch命令。

openfiledialog控件来打开文档。FileStream、BinaryReader读取文档数据。ReadBytes按照byte读取文档数据。

SerialPort1.ReadExisting读取串口数据,SerialPort1.Write对串口写数据

MessageBox.Show弹出消息对话框

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)休眠几个毫秒

高工
2013-04-08 09:51:45     打赏
20楼
为什么选择XC4VLX60FF668呢,这个片子应该不便宜呀,为什么不考虑spartan6呢。

共23条 2/3 1 2 3 跳转至

回复

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