• 11
  • 11月

这几天,Hanny稍微用了一下MMA7660传感器,详细阅读了一下MMA7660的DataSheet,又借着机会与FreeScale的工程师交流了一下,在这里总结一下MMA7660传感器的使用心得。

MMA7660是一款重力传感器,主要用于检测X、Y、Z三个轴所受到的加速度大小。检测范围是-1.5g ~ 1.5g,其中,g为一个重力加速度。

由于MMA7660比较低端,因此也只有6BIT的精度,而且输出值上还会有3个刻度的误差,因此在值的输出上,必须经过一个软件的均值滤波处理。一般来说,如果传感器只是应用于方位检测的话,8个值的滤波就够了。而用于动作检测的话,一般使用32阶的均值滤波。

MMA7660有两种工作模式,一个为Auto-Sleep,即Running模式。在该模式下,传感器可以配置较高的采样率。另一个模式为Auto-Wakeup,即Sleep模式。值得注意的是,该模式并非真正的休眠模式,而只是低速采样模式。在该模式下,能够有效地降低芯片的运行功耗。

MMA7660内部还支持几种常见的中断。在这里值得一提的就是Tap中断了。由于Tap是一个短时间的脉冲,因此只有在最高采样速率下,即120Samples/S下,才能够有效地触发Tap中断。

在动作检测的过程中,尽量采用的是相对的坐标值,而不是绝对的坐标值。因为在生产过程中,并不能保证传感器的绝对水平。

MMA7660的采用IIC的接口。IIC接口这里就不详细介绍了。Hanny在这里要说的是:在读取XYZ坐标的时候,最好采用的就是Multiple Byte Read的方式,这样才能保证XYZ三个坐标是同一次采样的结果。如果分开读取,则有可能读取到不同组的采样数据。

最后,总体来说MMA7660还是一颗比较低端的芯片,如果有高端应用的话,可以考虑使用MMA8452。

附:MMA7660的datasheet

MMA7660FC.rar (提取码: rhzq, 620.9 KB, 下载次数: 4032, 最后修改: 2012-02-29 23:19)

  • 7
  • 7月

小结一下SPIFlash,以便更好地兼容更多的SPIFlash

首先从命令上:

常用的,SPIFlash都支持的,并且不同厂家都共有的命令有:
01 写状态寄存器
02 写
03 读
05 读状态寄存器
06 写使能
D8 擦除

在读FlashID上,不同厂家支持的命令略有不同,但一般可以通过以下四条命令进行尝试,来确定Flash的厂家及型号:
9F AB 90 15

在处理兼容性的过程中,最多的就是处理写命令。对于Flash来说,有Page-Program,有Byte-Program等。不同厂家对此的支持不同,有一些Page-Program还要求必须以2Byte的整数倍来进行编程。

其次,就是去除写保护了。有些Flash在上电的时候是写保护的,如果需要进行写操作,则需要对状态寄存器进行操作。

在写完状态寄存器后,最后能够WaitBusy,并且读取状态寄存器以确保顺利写入。

再次,就是写状态寄存器之前是否需要写状态寄存器使能了。部分Flash需要,写状态寄存器使能的命令为50。

总之,仔细阅读好厂家给的,或网上下载的SPIFlash的SPEC,SPIFLASH的兼容性应该是没有太大的问题的。

  • 7
  • 3月

做SD/MMC卡驱动的项目也有大半年了,总觉得该总结些什么了。在这里,主要就是记录一些比较常见的问题及解决方法,以免再一次遇到。

首先就是SD/MMC卡的初始化错误问题。在找错误之前,先确认:1.用读卡器确认这张SD卡是否损坏;2.用另一套环境(一样的程序)读取同一张卡,是否正常;3.用相同的环境读取另外一张SD卡是否正常。如果是1,那么就直接退出本文章了;如果是2,那么就是该环境上出现虚焊短路或芯片损坏,问题也比较好办;如果是3,那么就说明程序和环境问题不大,可能是一些细节上的问题,可以参考以下内容的其中一部分;如果都不是,那么就要开始排查了。

寻找这类错误的原因,首先要检查的就是硬件。我想,第一步,我会确认原理图,看IO的连接是否正确,用万用表确认IO没有虚焊、短路。接下来,用示波器(如果没有,只能用万用表了),测量SD卡座的电源脚。一般来说,电压值应该在3.3V左右,如果相差过大,可能就是电路错误,或者LDO的供电能力不足了。

如果确认完以上两步,那么,硬件方面问题就不大了。接下来要确认的是固件上驱动程序的问题了。一般来说,如果这时候有个逻辑分析仪,那么问题就简化了。如果没有,只能按经验来一步一步排查了。首先要检查的是上电顺序,还记得在血的教训一文中提到这个问题。简单地说,就是先开电,再上拉。上电OK了?那么就看看初始化程序了。确认刚上电时的时序控制在100KHz到400KHz之间(一般采用240KHz左右,这里最好能用示波器确认),在发送第一条命令之前,确认主机已经发送足够的时钟(好像是74个时钟以上)。

然后,正式进入初始化程序。这里需要说一下SD/MMC卡的区分,浅谈SD卡和MMC卡的异同一文中也稍微讲了下这些。一般来说刚上电时,SD卡不支持CMD1而支持CMD55,MMC卡不支持CMD55而支持CMD1,这样就可以区分这两种卡。然后SD1.1和SD2.0卡主要通过CMD8来区分,总之,就是按照SPEC上的要求了。还要注意的是:上电时CMD55的参数为全0,ACMD41在SD1.1和SD2.0上的参数会有所不同。发送CMD0的时候,注意IO口电平,以防误入SD卡的SPI模式。

到了这一步,如果能够激活成功,后面的问题也就不大了。具体问题还需要具体分析。

就先简单记到这了。

  • 4
  • 3月

在使用电脑的过程中,为了安全起见,我们通常需要关闭自动播放。当然,有时为了某些用途,我们又需要打开自动播放。其实自动播放的开关也就几处,当然,本文只是Hanny在网上查找,并经过实验的一个总结,并不能覆盖所有情况。

第一种关闭自动播放的方法是组策略法,是Hanny认为最好,也是最简单的方法。开始 - 运行 - gpedit.msc,进入组策略管理器。选择 计算机配置 - 管理模板 - 系统 项,在右边找到“关闭自动播放”项,设置成为 已启用 即可。如果需要开启自动播放功能,则将该项改为 未配置 或 已禁用即可。

第二种是注册表法。开始 - 运行 - regedit,进入注册表编辑器。选择 HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Cdrom 目录。将AutoRun项的值改为0即可。当然,本方法如目录名所示,仅对Cdrom有效。改回1则重新开启本功能。

第三种是注册表禁止驱动器法。开始 - 运行 - regedit,进入注册表编辑器。选择 HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Policies \ Exploer 目录,修改NoDriveTypeAutoRun项的值即可(如果没有该项,则建立该项)。该项共有8位。这8位表示以下8种设备:

01: DKIVE_UNKNOWN 0101h不能识别的设备类型 02: DRIVE_NO_ROOT_DIR 1002h 没有根目录的驱动器(Drive without root directory) 04: DRIVE_REMOVABLE2104h可移动驱动器(Removable drive) 08: DRIVE_FIXED3008h 固定的驱动器(Fixed drive) 10: DRIVE_REMOTE 4110h网络驱动器(Network drive) 20: DRIVE_CDROM5020h光驱(CD-ROM) 40: DRIVE_RAMDISK 6040h RAM磁盘(RAM Disk) 80: 保留

这些位为0时,表示允许该种类的驱动器的自动运行特性,为1时,表示禁止该种类驱动器的自动运行特性。FF表示全部禁止,00表示全部允许,系统默认值为95表示禁止80 10 04 01这四种类型

第四种是注册表禁止盘符法。开始 - 运行 - regedit,进入注册表编辑器。还是选择 HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Policies \ Exploer 目录,修改NoDriveAutoRun项的值即可(如果没有该项,则建立该项)。
该值项的低26位分别代表从A到Z共26个驱动器的自动播放功能。如果该位为1,表示该位对应的驱动器的自动播放功能被禁止,如果该位为0,则该位对应的驱动器的自动播放功能被允许。例如我们只想禁止驱动器C和D的自动播放功能,对于其他驱动器的自动播放功能则想保留,那么我们需要修改NoDriveAutoRun的值为0x0000000c。

第五种是注册表挂载权限法。开始 - 运行 - regedit,进入注册表编辑器。选择 HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Exploer \ MountPoints2 目录,右键点击MountPoints2,选择“权限”,在“组或用户名称”里依次选择,然后在下面的权限框里把完全控制“拒绝”,全部组或者用户设置完毕,“确定”完成。

以上五种方法,只是一个初步总结,每种方法均可逆。但是,在测试过程中,有部份机子对上述的某些方法不起作用。在目前测试的机子中,只有第一种和第五种对所有的电脑都有效果。

  • 24
  • 1月

市场上充斥着太多的假U盘。而其中,扩容U盘又是假U盘中最恶劣的一种。

什么是扩容U盘呢?扩容U盘并不是指通过技术手段,使得U盘容量提高了。而是通过一些手段,使得我们在电脑上看到的容量只是一个虚假的容量,而不是U盘真正的容量。

要想真正的识别U盘是否被扩容过,首先了解一下常见的U盘扩容方法。

首先就是MBR修改法,这是一种入门级的扩容方法,这种扩容方法比较简单,也是广大的JS们常用的方法。MBR是磁盘的0扇区,也是磁盘的引导扇区,里面有存放着磁盘介质的容量。修改了引导扇区的容量信息,自然就欺骗过了Windows了。对付这种入门级的扩容方法也比较简单,直接拿一些工具修复引导扇区,更简单的方法就是直接写坏0扇区,再让Windows格式化就行。而识别方法,让BusHound抓一下Read Capacity这条命令,看看容量就行了。

接下来就是Capacity修改法,这种方法相对第一种略显“高明”一些,主要是主控芯片的量产工具,校验不严或者故意留下扩容接口,使得USB通信过程中,Read Capacity时,回报一个虚假容量。而造成的后果就是,前面的小地址使用正常,而后面的大地址数据不写入存储介质。现象就是,拷数据到大地址的时候,速度会突然间增块(因为不需要写入NandFlash)。对会这种方法也还比较简单,用BusHound直接物理写大地址,再读出校验就行。

再接下来就是Capacity修改加大地址循环映射法。举个例子,比如说1000M的U盘扩容成8000M的,前面的996M可能就一一对应真实的NandFlash地址,而剩余4M可能就循环映射7004M了。这样,有一些以4M写、4M读来校验扩容的软件可能就无法识别这种情况了。这应该就是常见的用工具测没问题,但实际拷文件却不能用这种情况了。

最后就是驱动级的扩容了。JS们在自己的电脑上动了手脚,装了一个驱动程序,使得可移动磁盘的内容映射到本地磁盘上。这样,你在他的电脑上怎么使用U盘都没问题,一回来就不行了。

说了这么多种情况,有没有什么方法可以直接确定这是不是扩容方法呢?最好的方法就是:拿这个U盘在一台电脑上拷满文件,然后到另外一台电脑上看文件是否正常。

如果选测试软件的话,本人推荐h2testw软件,除了测扩容,还能测坏块和读写速度。当然,最好使用自己的电脑,以免有人在驱动层上动了手脚。