基于ARM9+Linux2.6.30.4内核mbus总线采集器集中器一体化设备开发

总体思路: 
1、创建一个独立的工作环境。
2、构建一个最小的linux内核,只需要一些跟单板相关的必要驱动,能够正常运行。
3、开发linux程序,实现智能抄表系统功能。
4、后续完善。

       第一步:首先在VMWARE中为我的Fedora10-32虚拟机创建一个单独的磁盘,进入Fedora10系统使用fdisk命令对新的磁盘进行分区和格式化、创建文件系统,使新的磁盘可用。对这个新的sdc磁盘先使用fdisk  /dev/sdc,进入菜单后使用n增加一个新的分区,使用p增加主分区,输入1为分区号,然后选择分区大小,我选择默认大小即将整个磁盘分为一个区sdc1;使用w将分区信息写入磁盘并退出。使用mke2fs为sdc1分区创建ext2文件系统,最后可以用fdisk中的p命令查看下整个磁盘的所有分区。






测试一下看磁盘分区是否可用:



将/dev/sdc1   /mnt/mywork   ext2    defaults     1     1   添加到/etc/fstab中,这样系统启动后/dev/sdc1就自动挂载在/mnt/mywork目录下。



       第二步:构建linux运行系统,包括修改平台输入时钟为12M、NandFlash驱动移植、移植yaffs文件系统、编译BusyBox、构建文件系统、完善串口驱动并且测试了3个串口驱动、网卡移植(DM9000E+TL-WN823N 2.0)、usb驱动移植(两个usb host功能)。加入了3G/4G网络的无线模块,拨号测试成功,条件是在只有一个网络下,后续研究在多网络条件下的使用(即3G/4G pppd拨号网络、wifi无线网络、本地以太网络)。RTC驱动移植,注意在用date -s 设置时间的时候后面的时间应该用双引号包括:


       

最后加入watchdog功能,基本上需要的功能都包括了。在第二步的时候遇到一个问题,就是内核启动检查nand flash的时候报错,说nandflash上有许多坏块,我最开始怀疑是flash坏了,还准备修改分区,将根文件系统放到其他地方,但通过boot烧写根文件系统的时候flash起始地址总是为0x500000,找不到在那个地方修改,折腾了很久。最后我用boot里面的格式化flash命令重新格式化flash,再用备份的boot、zImage、root烧入flash中进行验证,发现又没有问题,我怀疑是不是我自己编译的zImage存在问题,我就clean,再重新完全制作了一个zImage,这次就没有问题了。 出现很多Bad block at 0x0 in erase block from 0x0 will be skipped这样坏块的原因
出现坏快的原因有很多,需要一项项排除:
1、假坏,记住坏块位置,在boot中scrub一下,擦掉坏块标记,再烧一遍随开发板带的image,看还有没有坏块,位置变了没有。
2、如果坏块和原来一样,检查nand的型号是否正确,对比nand的datasheet和烧写软件的nand参数配置是否一致。
3、如果参数没问题,检查nand的焊接。
4、都没问题,那nand可能是真那么多坏块,当然也可以怀疑驱动本身有问题。 只要好块数量足够,使用是没问题的。
        有一次我的nandflash报大量的坏块,用boot里面的format flash怎么都清除不了坏块,仔细想想也不可能出现这么多坏块塞,后来我是通过补焊nandflash芯片解决坏块问题的,估计是在使用的过程中多次拔插核心板,由外力导致nandflash出现虚焊,用软件擦除怎么都解决不了。

单板调试过程与问题:

问题1、3.3V电源问题,最初我是用S812C33芯片将5V转化为3.3v,看到3.3v电源led灯亮起来了以为就没有什么问题了,就将s3c2440核心板扣到底板上,发现核心板上3.3v的led灯先亮起来然后逐渐变暗,最后完全熄灭,就像掉电了一样,调试串口也没有任何输出。检查了3.3v电源没有和地短路,怎么会出现这种问题,难道是核心板负载过大,消耗的电流过大,将3.3v电压拉垮了。从这个方向出发,先是在S812C33芯片输出端加了个470uf的电容,仍然不行,查询了S812C33芯片输出电流的能力,发现在5v输入的情况下,芯片最大电流输出为50mA;然后换了一个Lm317d2t芯片,最大可输出1.5A的电流,根据公式在可调节端用了一颗R2=1.6K,R1=1K的电阻,输出3.38v电压,这样再扣上核心板后3.3v电压就很稳定了。
问题2、 好了,3.3v电压稳定了,现在问题来了,串口仍然没有输出,偶尔有输出,linux系统加载完后就一点反应都没有了,更多的时候是没有任何输出,从nor flash启动,boot也没有输出,究竟问题在哪里,通过Jlink用J-Flash可以烧写bootload,在烧写过程中遇到PC OF target system has unexpected value after bland checking 这样的问题,如下解决将Delay由0ms修改为2ms:


同时遇到这样的错误: unable to halt arm core failed to connect,解决方法如下:
1)打开J-Link Commander
2)在J-Link>之后输入rx 0 注意0前空格
3)输完之后按下复位键
4)这时显示还不能成功再次执行rx 0

5)点击J-Flash的target->Erase chip,将芯片里面的程序擦除之后即可再此连接下载。

总体来说核心板运行不稳定,怀疑是复位电路不好,s3c2440没能正常复位,接下来准备从复位电路入手看能否解决问题。



这个是正常的复位,用专门的复位芯片产生的,可以看到复位信号在3.3v电源信号后面大约200ms的时间后变为高电平。

这是专门的芯片复位电路。


这个是我用RC电路产生的复位波形,很难达到复位时序的要求。

这是我用的RC复位电路

7月3号,我买的max811复位芯片到手后,我迫不及待的做了一个复位电路,测试复位波形跟标准复位一致,但问题依旧,串口一点输出都没有,一点办法都没有。后来我跟卖开发板的 广州天嵌科技公司 联系 ,天嵌公司的技术支持和客服给了我很有力的支持,我给他们说明情况后,他们建议我将底板上的151引脚即nWAIT信号引脚用10K电阻上啦,由于我的底板没有焊接DM9000芯片,所以这个引脚没有做处理,我上拉后偶尔串口有输出,后面我又仔细检查了核心板通过2.0mm的双排插座到底板的信号联通性,发现核心板上的nWAIT信号跟底板上的nWAIT信号联通性不好,导致在用手按压核心板的时候偶尔有输出更多的时候没有输出。同样由于插座质量引起的连接性问题也发生在串口信号上,即串口只能输出数据,不能通过串口输入。经过几天的煎熬,到7月5号,核心板终于顺利启动起来,也就是说跟我自行设计的底板匹配起来了。
下面来仔细研究下这个nWAIT信号:

可以看出nWAIT是一个输入信号,由外设反馈给处理器的等待信号,请求延长访问周期,控制nWE和nOE作用时间。我在用JLINK调试天嵌的快速启动boot程序的时候发现在访问nandflash的时候进入一个死循环,就是这个死循环导致核心板不能正常启动,#define NF_DETECT_RB() {while(!(rNFSTAT&(1<<2)));}就是在不停地检测RnB的状态:


由于nWAIT信号被拉低导致对nandflash的读写访问始终不能完成,Rnb的状态始终为0,所以系统无任何反应。

今天将三个串口都调通了,一天进步一点离成功就不远了。


问题3、在调试串口的时候遇到一个问题,linux串口在接收的时候将0x0a识别为0x0d,通过查询网络资料后修改了串口设置,增加了options.c_iflag &= ~ (INLCR | IGNCR);这句就可以了。

 Mbus总线终于调试通过了



问题4、在调试RS485接口的时候发现一个设计上的问题,就是将485芯片3082的收发引脚跟max3232的收发连接到一起,两个再共享串口uart1的收发引脚,这两个芯片会相互影响,在使用3082接收数据的时候,3232的rx引脚会将uart1的rx引脚拉高,同样在使用3232接收数据的时候3082的rx引脚也将3232的rx引脚拉高,在设计上应该将两个芯片的连接分开或者使用跳线分开。下图是正确的设计,将两个芯片的连接使用跳线J305分开:



问题5、最近将linux内核源码纳入了svn管理中,因此创建了一个定制的linux源码目录cqznsb_linux2.6.30.4,在此源码目录中创建一个编译输出目录BuildOutput,这样编译过程中产生的中间文件就都在这个目录中了,这样就保持了源代码目录的整洁性,有利于svn进行管理。编译的步骤是先在源码目录中使用make menuconfig配置好内核,将配置好的.config文件拷贝到BuildOutput目录中,就可以在linux源代码目录中使用make O=BuildOutput/ 来进行zImage文件编译。后续如果需要重新配置内核就需要进入到BuildOutput目录中进行make menuconfig;make clean等操作,但在编译的时候需要返回到源码根目录。后面又做了两个脚本文件,makezImage和makeModules,并将BuildOutput中配置好的config文件备份到源码根目录中名字为cqznsb_config。


问题6、在调试nfs文件系统功能的时候,遇到一个问题,当在开发板上使用mount -t nfs 192.168.1.116:/mnt/mywork/root_nfs /mnt/test/命令的时候有错误产生rpcbind: server localhost not responding, timed out,然后使用mount -o nolock -t nfs 192.168.1.116:/mnt/mywork/root_nfs /mnt/test/就可以了。

问题7、在开发板中加入嵌入式ftp服务器(vsftpd): 

一> 编译 vsftpd 程序
1. 获得源码包:vsftpd-2.3.2.tar.gz
2. 解压,进入源码目录:
#tar xzvf vsftpd-2.3.2.tar.gz
#cd vsftpd-2.3.2
3. 修改 Makefile,指定交叉编译器:
CC = arm-linux-gcc
4. #make
编译时会出现错误,跟 libcap.so 有关
修改 vsf_findlibs.sh:
45-53 行注释掉:
# Look for libcap (capabilities)
#if locate_library /lib/libcap.so.1; then
# echo "/lib/libcap.so.1";
#elif locate_library /lib/libcap.so.2; then
# echo "/lib/libcap.so.2";
#else
# locate_library /usr/lib/libcap.so && echo "-lcap";
# locate_library /lib/libcap.so && echo "-lcap";
#fi
#make
生成 vsftpd 可执行程序,放到根文件系统/usr/sbin 目录下
二> 修改配置文件 vsftpd.conf
需要用到哪一项,就把这一项前面的注释‘#’去掉,这里给出我的配置:
anonymous_enable=YES
no_anon_password=YES
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
chown_uploads=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
async_abor_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES
ftpd_banner=Welcome to blah FTP service.
ls_recurse_enable=YES
listen=YES
listen_port=21
把修改后的 vsftpd.conf 文件放到根文件系统的/etc/vsftpd 目录下,否则运行时会出错: 500 OOPS vsftpd: cannot open config
三> 创建必要的帐号、目录
1. 建立 FTP 目录:
因为 ftp 目录不能开启所有权限,所以建一个 pub 目录加上所有权限,用来传输文件
# mkdir -p /var/ftp/pub
程序运行所用到的目录
# mkdir -p /usr/share/empty
2. 改变目录权限
# chown root:root /var/ftp
# chmod 755 /var/ftp
# cd /var/ftp
# chmod 777 pub
3. 添加帐号(如果系统中有,就不用添加)
# useradd nobody
# useradd -d /var/ftp ftp
四> 在开发板上运行 vsftpd
把制作好的文件系统下载到开发板上,在后台运行程序:
# vsftpd /etc/vsftpd/vsftpd.conf&
也可以把它写入启动脚本,vsftpd 后面的参数就是要使用的配置文件。
程序运行后可能出会现错误:
500 OOPS: could not bind listening IPv4 socket
解决方法:
1. 复制 vsftpd 源码目录下的 xinetd.d 文件夹到文件系统/etc 目录下,里面有一个文件 vsftpd,
修改其内容: disable = yes。
2. 可能是已经启动了 vsftpd,端口已被占用,再次启动 vsftpd 就会报错,可以先结束 vsftpd 进程,再启动。



我的集中器采集器设备V2.0版本,如下:


        PCB板子的设计上比V1.0版本要大了点,修正了V1.0板的错误,功能上更加完善,MBus多通道切换电路也调试通过,V2.0PCB板还需要进一步完善的地方,主要是MBUS接口保护和RS485接口保护部分的TVS管(SD101~SD103,SD301~SD303)的封装的焊盘需要加大一点,这样方便焊接;然后是15V转5V的芯片L7805考虑将其平放在PCB板上,因为核心板的电流有200ma左右,通过L7805的电流较大,导致其发热量高(用手触摸的话感觉还是有点烫手),如果可以平铺在PCB板上的话可以通过PCB及时将热量散去,当然这有待进一步确认。

        Mbus多通道切换电路需要做一点改进,控制三极管N501~N503的e级应该连接到地,这样bsp250MOS管 Q501~Q503才能打开,如下图所示。 


连续调试了几天终于将Mbus多通道切换电路完整设计出来了,并在板子上调试通过,正确的电路如下仿真设计:


当S1接到3v的时候,Q6、Q5导通,R9、R10进行分压,通过合理的电阻选择,不管在Q3上是否加载12V调制电压都可以让Q3关闭,当S1接到0v的时候,Q6、Q5关闭,R10、R13的分压可以让Q3在加载和没有加载12V调制电压的时候都导通。而之前的设计存在的一个问题是0v的时候Q3没有导通,在进行电压调制的时候,发送mark的时候加载12v的Q3导通,发送space的时候为0v,Q3截止,在表具端的表现为一个0v到39v变化的方波,想到于表具在不停地重复上电,而不是在27v的基准电压上进行的12v调制的方波。当然也有用继电器的方式设计多Mbus通道。
        下图为v2.1版本,主要将L7805平铺在pcb上,使pcb板散热均匀。在pcb板设计的时候对于发热大的元件,在其下面可以大面积铺铜,用于散热,这样可以提高元件的可靠性。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值