CAN review

本人最早在06、07年开始搞CAN总线,采用的是RM9200+SJA1000和LPC2100通信。 当时CAN有CANOpen和DeviceNet 2种架构之分。我们采用了开源的lincan-0.3.2,把CAN注册为一个char设备,然后通过read/write函数进行CAN报文的接收和发送。 最近玩了freescale的i.MX6UL,这颗CPU本身具备2路CAN总线。 查了下当前CAN的支持,发现从2.6.25开始,CAN已经被引入到linux内核中,并被作为一个socket设备进行管理。 工具 由于CAN被整合进network,所以需要新的ip才能支持,点击进官网。或者可以使用GIT同步代码: [crayon-6875965a40b64415220497/] 常用的CAN命令 查看可设置的配置参数: [crayon-6875965a40b69909417230/] 设置CAN波特率为1Mbps: [crayon-6875965a40b6a262603733/] 查看CAN的配置: [crayon-6875965a40b6b472965348/] 启动/停止CAN: [crayon-6875965a40b6c291568349/] 或者 [crayon-6875965a40b6d407021292/] 接收CAN报文: [crayon-6875965a40b6e143487886/] 发送CAN报文 [crayon-6875965a40b6f952793796/] 例如使用通道CAN1发送CAN ID为1,带有5个数据(0x01 0x23 0x45 0x67 0x89)的报文: [crayon-6875965a40b70945969529/]…

HID FAQ

HID FAQ Questions relating to designing and programming USB devices in the human interface class. Also see: HID Page Sending and Receiving Reports under Windows How can an application request…

Bingo,成功重写了USB控制传输

最近我们公司使用了一款智能卡芯片。该芯片为USB接口。 厂家提供了USB CCID源码,但是由于客户需要免驱只能使用HID或Mass storage Class。 经过几天的调试,Windows和Linux均可以识别为HID设备,但是使用set report时,通过bus bound可以看到urb发送出去,但是设备并没有进到set report函数。重新看了代码,发现原来是在USB insert和CCID通信过程中Control Endpoint不会发送带数据的Control Transaction。所以厂家的代码没有对其进行处理。 在试图在厂家代码上修改接受带数据的Control Transaction失败之后(厂家的代码可读性不是一般的差,虽然是51程序,也不至于全局变量满天飞吧,还有好多无意义代码和永不会执行到的代码)。 于是决定重写USB底层代码。周5约了厂家的一个技术支持详谈了2个多小时,解决了阅读USB specification、厂商datasheet和厂商代码的一些疑惑。 今天成功重写了USB底层代码,插入USB后可以成功识别为HID设备。

CF-Card拷贝出错——续

终于解决CF卡出错问题了。先记录如下: 当我在板子上面对主机的文件进行MD5校验的时候惊奇的发现同一个文件在板子和主机上面居然MD5也不一样。主机的目录是用NFS mount到板子的。那么就有可能有2个原因: 网络错误 内存错误 NFS服务我是相信的,不然不可能用的这么广泛。那么只有一个可能,内存有问题。 于是换了一个板子。mount后md5文件,与在主机的MD5值一样。好的。这事内存问题。那么拷贝文件出错是不是也是内存影响的呢? 重新拷贝,md5sum后发现与主机一样。KO。搞定了 做了一夜的拷贝、md5sum、删除,CF卡都依然坚挺。看来是内存问题了。折腾了我好久。郁闷~~~~~ 手头还有一个Kingston的256M的CF卡,插上去试试,发现在分区保存的时候打印下面的错误: hda: task_no_data_intr: status=0x51 { DriveReady SeekComplete Error } hda: task_no_data_intr: error=0x04 { DriveStatusError } hda: Write Cache FAILED Flushing! 呃。难道还有问题。…

CF-Card拷贝数据出错

整理了一下前几天给客户的DOC2CF。 当我把CF卡的文件在拷贝到主机后,发现了一个问题:拷贝到CF卡中文件的MD5和拷贝前的MD5不一样。这个是一个隐患,也就是说现在的CF卡是不稳定的,很有可能出现DOC同样的错误。 首先解决的问题是,这个文件是拷进来的时候出错了还是拷出去的时候出错了。 拷贝文件到CF卡后把卡取出,通过CF卡读卡器在电脑上校验发现MD5错误 把CF卡中的文件拷贝回电脑发现CF卡的文件和电脑里文件的MD5一样 结果是CF读是没有问题的,问题在于写CF的时序。

CompactFlash Card on MPC8241 using at 8-bits True IDE mode

由于我们公司的一款MPC8241板子存在以下问题 64M DOC空间不够 128M DOC不稳定,文件系统经常损坏 所以我们做了一个DOC转CF的转接卡,由于DOC是8-bits宽度,所以CF卡也只能用8-bits方式。 在CF卡复位后应该使用命令使CF卡工作在8-bits模式,并且不能使用DMA方式。 PS: 这个简单的东西调了整整2天,faint。原因就是第一次调试CF卡的时候写了一个简单的probe程序,当时使用的是16-bits宽度。定义基地址类型的时候使用的是volatile unsigned short *,这次调试的时候没有想起来,结果每次地址加1实际上都是地址加2。导致CF每次读都是在PowerDown模式,把我引进了一个错误的方向。 而对自己的驱动太放心,只是测量了D0是不是正确的,没有测量A0。2天时间都在怀疑时序是不是有问题。 昨天晚上11点终于忍不住量了以下A0,结果发现A0没有变化,A1上出现了波形,最终成功probe到了CF卡。 PS PS: 调试的时候千万不要有侥幸,自己写的代码要考虑清楚,硬件信号该量就要量,不要怕费事麻烦。

USB Class CCID

名词解释 CCID: Integrated Circuit(s) Cards Interface Device ICC: Integrated Circuit(s) Cards 概述 当一个CCID插入USB host时,它可以有或者没有一个插入的ICC。 CCID模型假设一个ICC被或者可以被插入到设备。这就是"slot change"中断消息的目的。 CCID功能特性 通信管道 控制管道 控制管道消息用来控制一个USB设备。这些消息包括标准请求,例如GET_DESCRIPTOR和SET_CONFIGURATION。命令经由默认管道发送,报告信息也经由默认管道返回给主机。如果产生了一个错误,它会产生一个标准的USB错误状态。 中断管道 CCID模型在中断管道处理异步事件。ICC在线,ICC移除或者硬件错误比如电流太大,这些经由这个管道送出。 中断管道对于一个支持ICC插入/移除的CCID是强制的。对于一个只插入没有移除的ICC是可选的。 块进,块出管道 CCID命令经由BULK-OUT端点发出。每个发送给CCID的命令都有一个相应的响应。一些命令也有过程响应。这些响应从BULK-IN端点发送。 所有发送给指定CCID槽位的命令都必须同步发送。一个指定的槽位同时只能接受一条命令。如果一个槽位准备好接受一个新命令那么就认为它是空闲的。 协议和参数选择 CCID在与主机的底层交互的dwFeatures字段声明TPDU、APDU(短或扩展)或者字符。 TPDU层交互 对于PPS交互的TPDU格式如下:…

GSM命令详解

配置命令 名字 功能 AT&F 设置所有参数为工厂默认 AT&V 显示当前配置 AT&W 保存当前配置到用户profile AT+CMEE 移动设备错误信息格式 0 - 禁止错误代码,仅显示"ERROR" 1 - 显示数字错误代码 2 - 显示字符串错误代码 串行接口控制命令 名字 功能 AT\Q[<value>] 流控控制 0 - 无流控 1 –…

NXP 2XXX CAN总线自测试

NXP2XXX的CAN控制器具有自测试功能 Global Self-Test Local Self-Test 如上。如果是Global Self-Test模式,则需要一个node硬件环回CAN报文。如果是Local Self-Test模式,则不需要node,而是通过终端电阻环回CAN报文。

Smart Card 7816 receive lost

ATME AT91RM9200串口有7816模式。 单独测试7816没有问题。但是在有ping包发现APDU出错。 经过DEBUG发现是7816接收APDU丢失字节。怀疑是7816发送接收切换被中断干扰。 修改7816发送最后一个字节在中断进行,发送完毕后打开接收。