灞波儿奔

  • 2019-05-21
  • 发表了主题帖: 单片机驱动9013三极管实现红外发射电路图

    单片机驱动9013三极管实现红外发射电路图

  • 发表了主题帖: 简单声控灯电路原理图和PCB布线方法

    简单声控灯电路原理图和PCB布线方法

  • 发表了主题帖: PASS F5 后级功放

    PASS F5这个简单而出名的电路,其实想做很久了,一直都没动手 在别人的鼓吹下,终于去买了几个240和9240用洞洞板焊起来 其实F5也挺好调试的,没上灯泡,一次成功 大管是买拆机的10块一对,输入FET用K170和J74 这个热敏我买成1块一个,应该是买贵了 没使用原电路上的过流保护

  • 发表了主题帖: JHL HOOD 1969 小甲类功放板

          美国人JHL在1969年设计的这款推挽输出晶体管功放HOOD1969,经久不衰,虽然只有区区甲类10W的输出,但是听感音量可以媲美家用的50W功放.高频细腻,延伸很好,中频厚实,低频饱满,用来听人声铉乐是最佳的选择! 推荐电源采用大于300W变压器,输出交流为单20V--26V(板上元件设计为22-24V).调试中点电压为1/2直流电压,调整整机电流为1.5A--2A,下图为示波器在直流26V时,输入1KHZ的音频信号,输入幅度为0.65V,电流1.6A时的波形,很完美~~~~!        调试办法是:先将R1和R7用可调电阻代换,将R1和R7的可调电阻调至最大阻值!调整R1(100K)的阻值,万用表在直流50V档位,红表笔接C4正极,黑表笔接地.可以调整输出中点为1/2V供电电压,接下来调整R7的可调电阻,将万用表在5A位置,红表笔接在直流滤波输出正极,黑表笔接B+,调节R7使读数为1.5A-2A(具体视散热器温度来定,散热器温度高就调小电流,温度低就调大电流,不过最高不应超出2.5A),调整好后,再测试中点电压为1/2V电源电压.然后监测电流大小,等散热器温度上升后控制在50-80C°. PCB规格:10*10 板厚1。6mm玻纤板      板面颜色为单面红色阻焊,丝印色为白色。输出管金封三极管和塑封三极管两用。整板仅在上塑封三极管时有1根跳线。大电流走线均有淌锡线。此板配全新原装MOT3055功率管。

  • 发表了主题帖: tda2030a单电源功放电路图

    tda2030a单电源功放电路图

  • 2019-05-20
  • 发表了主题帖: DSP28335使用FIFO的串口中断

    一、串行通信与并行通信 DSP控制器间,DSP控制器与外部设备间交换信息,通信,可采取的通信方式主要两大类1、串行通信 2、并行通信。 并行通信一般包括多条数据线、多条控制线和状态线,传输速度快,传输线路多,硬件开销大,不适合远距离传输。一般用在系统内部,如XINTF接口或者控制器内部如DMA控制器。 串行通信则在通信线路上既传输数据信息也传输联络控制信息,硬件开销小,传输成本低,但是传输速度慢,且收发双方需要通信协议,可用于远距离通信。串行通信可以分为两大类1、同步通信 2、异步通信 同步通信:发送器和接收器通常使用同一时钟源来同步。方法是在发送器发送数据时同时包含时钟信号,接收器利用该时钟信号进行接收。典型的如I2C、SPI。 异步通信:收发双方的时钟不是同一个时钟,是由双方各自的时钟实现数据的发送和接收。但要求双方使用同一标称频率,允许有一定偏差。典型的如SCI。 二、28335SCI介绍 F28335处理器共提供3个SCI接口,相对TI的C240X系列DSP的SCI接口,功能上有很大的改进,在原有功能基础上增加了通信速率自动检测和FIFO缓冲等新的功能,为了减小串口通信时CPU的开销,F28335的串口支持16级接收和发送FIFO。也可以不使用FIFO缓冲。SCI接收器和发送器有各自独立的中断和使能位,可以独立地操作实现半双工通信,或者同时操作实现全双工通信。为了保证数据完整,SCI模块对接收到的数据进行间断、极性、超限和帧错误的检测。为了减少软件的负担,SCI采用硬件对通信数据进行极性和数据格式检查。通过对16位的波特率控制寄存器进行编程,可以配置不同的SCI通信速率。 所谓的FIFO就是先进先出的意思。SCI工作在FIFO模式下一般是因为所传输的信息并不是以一个帧为单位,而是以多个帧组成的一个包为信息单位的。比如说我的一个数据包由5个帧组成,第一个为控制字节,后四个字节共同组成一个浮点数。这时你可以设置FIFO接收中断为5个字节时产生中断。设置以后,每接收到5个字节后才会产生一次中断,而不是每接收一次产生一次中断。这样可以大幅减小CPU的开销。而先进先出的意思就是:在中断中,你读FIFO接收寄存器读到的数据是首先接收到的数据,再读一次的话读到的是接收到的第二个数据。而16深度的话就是最多能保存最近的16个接收数据,如果接收数据超过16个的话会产生相应的溢出,可以软件编程对溢出进行处理。 对于发送FIFO也是一样,你可以一次将多个数据放到发送FIFO中,然后DSP按先后顺序依次发送数据。 三、SCI模块的特点如下(通过相应的寄存器可以对这些功能进行设置)    (1)2个外部引脚:SCITXD为SCI数据发送引脚;SCIRXD为SCI数据接收引脚。两个引脚为多功能复用引脚,如果不使用可以作为通用数字量I/O。    (2)可编程通信速率,可以设置64K种通信速率。    (3)数据格式:         ◇ 1个启动位;         ◇ 1~8位可编程数据字长度;         ◇可选择奇校验、偶校验或无效校验位模式;         ◇ 1或2位的停止位。    (4)4种错误检测标志位:奇偶错误、超越错误、帧错误和间断检测。    (5)2种唤醒多处理器方式:空闲线唤醒(Idle-line)和地址位唤醒(AddressBit)。    (6)全双工或者半双工通信模式。    (7)双缓冲接收和发送功能。    (8)发送和接收可以采用中断和状态查询2种方式。    (9)独立地发送和接收中断使能控制。    (10)NRZ(非归零)通信格式。    (11)13个SCI模块控制寄存器,起始地址为7050H。    (12)自动通信速率检测(相对F140x增强的功能)。    (13)16级发送/接收FIFO(相对F240x增强的功能)。 四、SCI主要功能单元    (1) 1个发送器(TX)及相关寄存器。             ◇ SCITXBUF:发送数据缓冲寄存器,存放要发送的数据(由CPU装载);         ScicRegs.SCITXBUF=a;//向数据缓冲寄存器中写入数据即可发送该数据             ◇ TXSHF寄存器:发送移位寄存器,从SCITXBUF寄存器接收数据,并将数据移位到SCITXD引脚上,每次移1位数据。    (2)1个接收器(RX)及相关寄存器。             ◇ RXSHF寄存器:接收移位寄存器,从SCIRXD引脚移入数据,每次移1位;             ◇ SCIRXBUF:接收数据缓冲寄存器,存放CPU要读取的数据,来自远程处理器的数据装入寄存器RXSHF,然后又装入接收数据缓冲寄存器SCIRXBUF和接收仿真缓冲寄存器SCIRXEMU中。    (3)一个可编程的波特率产生器。    (4)数据存储器映射的控制和状态寄存器。

  • 发表了主题帖: 针对含DSP电路板的测试方法与诊断分析

    本帖最后由 灞波儿奔 于 2019-5-20 23:17 编辑 在现代雷达系统中,含DSP电路板应用很广,含DSP电路板通常是以某种DSP芯片为核心,外围配以双口RAM(DRAM)和闪存(Flash)等器件。DSP芯片大多支持IEEE1149.1标准,并且在电路板中形成了边界扫描链,支持边界扫描。本文采用边界扫描技术与传统的外部输入矢量测试方法相结合,为含DSP电路板的测试与诊断提供了可以借鉴的方法。  2.电路原理简介及总体测试思想  2.1 电路原理介绍  本文以雷达系统中某含DSP电路板为例对测试方法进行介绍,该电路以AD公司的ADSP-21160M为核心,外加DRAM、Flash、信号匹配转换器组成,Flash为DSP工作提供配置程序,4个DSP之间通过Link口进行数据交换,同时DSP的部分数据线和地址线与DRAM的数据线和地址线相连,DSP的Link口通过信号匹配转换器与外部连接器进行数据交换。该电路板在电路器件构成上使用了集成度较高的器件,芯片封装采用了PQFP132、PLCC100等多种表贴器件,器件引脚间距极小,采用探笔测试可能破坏电路工艺;并且电路上的DSP芯片不能从电路板上取下,所以采用边界扫描技术较为合理。如图1所示。     2.2 测试与诊断分析  对电路中核心器件DSP的资料分析,芯片具有JTAG测试接口,具备边界扫描测试的条件。但边界扫描测试不是基于IP内核的测试,使用边界扫描技术可以对电路测试但无法达到全面的测试与诊断,所以可以利用与传统的外部输入矢量测试方法相结合的方式实现电路的互连以及器件功能的测试,达到故障定位的目的。  2.3 测试系统组成  根据测试与诊断需求、测试工具以及电路本身的特点,设计稳压电路、JTAG测试接口转换电路以及加入一片具有边界扫描功能的芯片(FPGA)构成的电路实现了对电路测试所需的资源。  *稳压电路。稳压电路对测试系统程控电源发送过来的电压进行滤波、稳压后提供被测板的工作电压,保证被测板电源不会因为意外的原因产生突变。  *FPGA电路。该部分电路为被测板提供测试的地址和数据信号,测试时使用系统平台上的边扫控制器将被测电路板上DSP的测试链路的JTAG口与适配板上的FPGA的JTAG口构成一个测试链路,实现4个DSP之间互连测试、DSP与连接器连线测试、通过对FPGA配置程序实现FPGA与DSP间互连线测试。  *JTAG测试接口转接电路。将被测板上的DSP与测试转接板上的FPGA的JTAG接口构成一个测试通道,形成一个边界扫描测试链路。如图2所示。   3.测试与诊断流程开发  基于边界扫描技术的测试诊断流程开发主要内容包括对边扫器件链路设计、引脚映射关系设置、边界扫描控制器相关文档设置,以及测试脚本语言的开发。图3是该电路板的测试诊断流程图。     *测试链路功能测试。实现对边扫器件构成的测试链路的连接情况进行测试,以及完成边扫器件引脚输入输出功能是否正常测试,只有在测试链路测试通过后才能使用边界扫描控制器进行后续测试。  *互连测试。依据被测板电路原理图和测试转接板原理图的网表文件,通过边界扫描测试软件实现对被测电路板上的边扫器件(DSP)、测试转接板上FPGA共五个器件间两两互连线的是否出现开路、短路、虚焊等问题的测试。  *Flash测试。被测电路板上的每个Flash的控制使能信号由不同的器件进行控制,在对Flash的测试过程中需要开发针对各Flash测试与诊断的测试脚本,在测试的过程中完成对故障的分析和定位,开发的测试脚本能够定位到器件的具体引脚故障。  *DRAM测试。通过连接器发送DRAM配置程序的触发信号,FPGA产生DRAM的读写时序,对DRAM的读写功能进行测试,FPGA读写的测试结果进行判读并生成一定的测试结果数据由连接器采集至测试系统,判断该部分电路功能是否正常。  按照上述开发过程实现的测试诊断流程的故障覆盖率≥83%,故障检测率约为92%,隔离到3个器件以内的故障隔离率≥95%.  4.总结  通过在测试转接板上放置具有边界扫描功能的芯片将该芯片与被测板上的边扫芯片构成测试簇,传统的外部输入矢量测试弥补了边扫测试的不足,进而实现了较高的电路测试覆盖率。

  • 发表了主题帖: 将新6轴IMU与DSP结合实现高性能运动跟踪精度

         高性能运动跟踪技术已从深奥的军事,航空电子,船舶和工业应用转移到不断扩展的消费应用领域。尽管如此,将高性能运动跟踪引入消费者市场往往迫使设计人员协调相互冲突的目标,特别是在成本,功耗和计算资源方面。   然而,由于MEMS设计和制造的进步新一代惯性测量单元(IMU)正在帮助设计人员提供更高水平的性能,同时减少妥协。   本文将在介绍新的6轴IMU之前概述设计问题和权衡。承诺从主处理器卸载计算密集型操作。它还将讨论新的计算分区策略,帮助设计人员在显着降低的系统功率水平下实现更高水平的运动跟踪精度。最后,将讨论新的最佳估计算法和开发工具包,以便开发人员构建更高效的传感器融合解决方案。   传感器性能权衡   通常,消费者设备必须优化低成本。传统上,使用MEMS运动传感的消费系统设计人员在对数据进行进一步处理之前,选择将加速度计和陀螺仪样本从IMU传输到应用处理器(AP)或传感器集线器控制器。   然而,精确运动跟踪需要大量计算资源来执行与当前可用的6轴和9轴IMU的传感器融合。在这些应用中,设计人员必须支持至少几百赫兹或更高的采样率。设计人员一直在努力以低成本提供高水平的性能,而不会使系统处理器过载并破坏用户体验。   设计人员面临的另外两个问题是上市时间和最小化功耗。鉴于所有传感器随时间漂移,校准是开发高度准确和一致的运动跟踪子系统的关键。编写自动校准算法是一种选择,但它所花费的时间经常与消费者市场中常见的上市时间较短的窗口相冲突。随着高性能跟踪进入便携式和无线系统,系统功耗的限制提供了额外的障碍。开发人员努力提供高精度运动跟踪所需的大量计算资源,同时优化电池寿命。   最近的一些技术进步有望使开发人员的工作变得更加容易。新的6轴IMU现在配备了先进的矢量数字信号处理(DSP)协处理器,承诺从主处理器卸载计算密集型操作。与此同时,新的计算分区策略正在帮助设计人员在显着降低系统功率水平的情况下实现更高水平的运动跟踪精度。最后,基于扩展卡尔曼滤波理论的新的最优估计算法现在允许开发人员构建更有效的传感器融合解决方案。   智能IMU   新一代MEMS IMU的一个很好的例子是FIS1100最初由Fairchild开发,现在是安森美半导体的一部分。这款智能MEMS传感器模块集成了一个3轴加速度计和一个3轴陀螺仪,并为可选的外部第三方3D磁力计提供输入。当与XKF3传感器融合库和3D磁力计一起使用时,FIS1100提供完整的9自由度(9DOF)解决方案(图1)。   IMU的一个关键组件是AttitudeEngine,这是一种定制矢量DSP协处理器,能够以高内部采样率编码高频运动,同时保持任何输出数据速率(ODR)的完全精度。这允许协处理器以在通用系统处理器上执行相同计算所需功率的一小部分来处理惯性数据。   使用FIS1100,设计人员可以使用协处理器从主机卸载计算密集型操作处理器,无需频繁的数据中断,并允许系统处理器更长时间保持睡眠模式。这种专用硬件模块可以将运动信号处理功耗降低10倍,而不会影响精度。http://file2.dzsc.com/data/19/03/25/9207_135720765.jpg   将新6轴IMU与DSP结合实现高性能运动跟踪精度图1:在典型应用中FIS1100 IMU通过主I 2 C接口将其嵌入式3轴陀螺仪和3轴加速度计与第三方磁力计集成在一起。应用处理器通过SPI 4线接口管理此9DOF解决方案。 (图像:安森美半导体)卡尔曼滤波   为了在极低功率水平下开发更高精度的运动跟踪解决方案,开发人员正在采用基于卡尔曼滤波理论的新的最优估计算法。通常,卡尔曼滤波是一种算法,其使用随时间观察的一系列测量,其包含统计误差和其他不准确性以预测未知变量的估计。该系列往往比单次测量更精确。   卡尔曼滤波器通过使用两步形式的反馈控制来估计过程。滤波器在某个时间估计过程状态,然后以噪声测量的形式获得反馈。因此,卡尔曼滤波器的方程分为两组:时间更新方程和测量更新方程。时间更新方程负责预测(及时)当前状态和误差协方差估计以获得下一时间步的估计。测量方程负责反馈。   记录下一次测量的结果后,使用加权平均值更新估算值。在这个过程中,更高的确定性给予估计更多的权重。   重要的是要记住卡尔曼滤波算法是递归的。这使得实际实施更加可行。   与设计为直接针对每个估计对所有数据进行操作的其他方法不同,卡尔曼滤波器理论递归地调整所有过去测量的当前估计。它可以仅使用当前输入测量值和先前计算的状态及其不确定性矩阵实时运行。不需要额外的过去信息。   传感器融合的进展   上述卡尔曼滤波技术由XSENS的工程师使用,XSENS是Fairchild于2014年收购的传感器融合软件开发商。该团队创建了一种称为XKE3的最佳估计算法,可在极低功率下提高运动跟踪性能。 XKE3传感器融合是一个二进制软件库,集成了3D加速度计,3D陀螺仪和3D磁力计数据,用于计算地球固定参考系中的3D方向。 XKE3算法的可靠性已经确立;它们已经在军事和工业应用中使用了十多年。   通过捆绑FIS1100,其3轴加速度计和3轴陀螺仪与第三方磁力计和XKE3传感器融合软件,ON Semiconductor为开发人员提供完整的9DOF解决方案。此外,这种捆绑式解决方案通过提供滚动,俯仰和偏航方向规范,大大简化了系统开发。   传统上,需要添加运动跟踪功能的设计人员必须通过古老的传感器级规范,并学习复杂的运动处理基础知识。现在,他们有一个提供滚动,俯仰和偏航规格的解决方案,使他们能够在构建第一个原型之前了解所期望的航向性能。   在微控制器或应用处理器上运行,XKE3库收集运动来自FIS1100的数据以可配置的速率。在这个9轴解决方案中(图1,再次),FIS1100以相对较高的频率(1 kHz)对加速度计和陀螺仪数据进行采样,并将其发送到AttitudeEngine协处理器,该协处理器以高精度执行捷联式积分(SDI)计算。协处理器还将磁力计数据与惯性数据同步,以获得克隆和划分补偿方向和速度增量,以及可选的磁力计数据,并将其全部传输到XKE3引擎。   XKE3起着关键作用在传感器校准中。例如,从振动和温度到设备老化和机械应力的各种过程可以随时间改变磁力计输出。通常,校准参数的这些变化非常微妙。 XFK3使用零用户交互校准补偿这些变化,该校准可连续自动校准每个传感器以查找最重要的错误。这消除了用户中断的需要。   计算分区   FIS1100和XKE3以更低功率改善运动跟踪性能的另一个关键因素是使用创新的计算分区策略。传统上,设计人员将加速度计和陀螺仪样本从IMU流式传输到主处理器,然后主处理器执行惯性量的SDI。该架构如图2所示。然后,传感器融合算法使用积分值来提供所需的输出。http://file2.dzsc.com/data/19/03/25/9207_135819228.jpg   将新6轴IMU与DSP结合实现高性能运动跟踪精度图2:在传统架构的描述中,加速度计和陀螺仪样本直接从IMU流式传输到主处理器,以执行惯性量的SDI。 (图片:安森美半导体)采用这种架构,加速度计和陀螺仪信号从IMU到主处理器的高速流传输对于保持运动跟踪精度是必要的。然而,由于最终应用所需的更新速率仅为几赫兹,适用于行人导航,高达30至60赫兹的游戏,健身追踪和机器人控制等应用,因此无需向主处理器进行高速数据传输。 。甚至更高性能的应用,如虚拟和增强现实只需要大约100赫兹。在这种情况下,设计人员只需要以高速率传输数据,以便对加速度和角速度进行精确的数值积分。   然而,设计人员仍然需要为高速流数据付出代价。该架构迫使主处理器处理更频繁的数据中断,防止它尽可能频繁地进入睡眠模式。因此,整体系统功耗上升。   缓解此问题的一种方法是在IMU侧使用FIFO缓冲器。不幸的是,这种方法带来了新的问题,例如:   主机处理器需要处理更多数据   SPI/I上总线争用/冲突的可能性增加 2 当多个外设共享同一总线时无线应用中丢包概率较高   对高速串行总线模式的需求增加主机处理器上的DMA支持设计人员可以通过将算法分割为在FIS1100上运行的高性能部分,大大减少系统处理器的计算负荷,FIS1100是运行的低速段XKE3引擎,然后使用FIS1100在IMU端实现SDI算法(图3)。当系统以高精度,3D融合模式运行并进行全自动校准时,这种方法更有用。http://file2.dzsc.com/data/19/03/25/9207_135832436.jpg   将新6轴IMU与DSP结合实现高性能运动跟踪精度图3:随着通过上述架构,设计人员可以在FIS1100 AttitudeEngine上执行高数据速率SDI计算,并将低速率方向和速度增量流式传输到主机端运行的XKF3传感器融合算法,从而获得更高的功效。 (图像:安森美半导体)此外,通过在XKE3引擎上以非常低的采样率运行状态跟踪部分,设计人员可以跟踪更多的状态,实现多个校准的统计最优跟踪参数不用支付系统资源的罚金。   在AttitudeEngine模式下运行FIS1100,设计人员可以通过将加速度计和陀螺仪信号转换为数字域,以及使用宽带约200 Hz的低通滤波器来实现这一目标。这允许AttitudeEngine在硬件中以1 kHz输入速率执行SDI计算,确保来自运动积分的数字计算的任何误差都可以忽略不计。   将FIS1100流运动数据编码为方向和速度增量代替传统的角速度和加速度样本,计算是准确的,与所选择的输出速率无关。低输出率导致运动数据的较粗略时间表示,但数据保持准确。因此,可以根据特定的应用要求选择输出速率,而不是由高精度执行数值积分的需要驱动。   使用这种创新架构,设计人员可以获得多种好处:   在专用硬件而非主处理器上运行SDI可显着降低功耗无论选择的输出数据速率如何,运动信息都保持准确将SDI功能移至该体系结构的IMU端通过降低计算需求简化了系统集成开发套件以启动设计   构建高精度运动跟踪解决方案可能需要大量时间和精力。为加速分析系统性能和精度,以及简化硬件集成和嵌入式软件集成,安森美半导体为FIS1100提供评估套件。该套件提供FIS1100的评估系统,结合XKE3传感器融合库,FIS1100的参考驱动程序,以及ARM?Cortex?-M微控制器的示例传感器融合项目。   评估套件是通过易于使用的MT管理器Windows GUI应用程序进行管理。评估首先将Arduino兼容的FEBFIS1100 MEMS_IMU6D3X屏蔽层安装到NXP LPCXPRESSO54102 MCU板上,如图所示(图4)。然后,MCU板通过USB电缆连接到主机PC。  http://file2.dzsc.com/data/19/03/25/9207_135847479.jpg  将新6轴IMU与DSP结合实现高性能运动跟踪精度图4bhttp://file2.dzsc.com/data/19/03/25/9207_135900276.jpg   图4:FIS1100评估套件通过提供安装与Arduino UNO R3兼容的FEBFIS1100MEMS_IMU6D3X屏蔽的双板组(a),简化了系统性能分析和软件与硬件集成恩智浦LPCXpresso54102 ARM Cortex-M开发板(b)。 (图片:安森美半导体)安装驱动程序后,用户启动MT Manager应用程序,自动扫描已连接的系统和显示器。当开发人员在设备列表中选择评估工具包时,他们可以通过打开输出配置面板来管理系统操作参数。可以通过输出配置对话框屏幕配置FIS1100和XKE3融合库的所有主要功能。   为了帮助解释传感器数据,MT Manager提供了许多有用的可视化工具。 3D方向视图提供评估板的3D方向的表示。惯性数据视图有助于用户理解XKE3融合库输出的惯性和磁场数据。包括对典型传感器误差的校正,例如陀螺仪偏差和磁性硬铁和软铁扭曲。对于需要跟踪系统短期运动的用户,例如手臂相对于躯干的运动,速度数据视图提供了XKE3融合库的高通速度输出的图形利用。   结论   高性能运动跟踪功能不再局限于神秘的军事和航空电子应用。如今,在对成本敏感的消费者市场中开发相同功能的需求正在快速增长。如上所述,设计人员现在可以应用新一代智能,低噪声,低漂移的IMU。计算分区的新方法和传感器融合软件的进步使这种转变成为可能。

  • 发表了主题帖: 怎样选取滤波电容?

    当变压器副边输出交流电压经过二极管整流后,连接电容进行滤波。这里有一些小问题。 U0整流前电压,U1整流后输出电压,U2负载电压,RL负载电阻,这里的电压都是平均值。 二极管整流后,输出电压脉动非常大,加滤波后变得平滑,在一个周期内,电容先对负载进行放电,当电容两端电压小于二极管输出电压时,进行充电。关于放电时间和充电时间,当放电时间大于充电时间,二极管导通角将变小。电容越大,时间常数越大,脉动越小,则导通角越小,充电时间越短,电流平均值越大,负载的电压则越大,在导通的时间内,二极管电流等于负载电流(疑问:这里究竟电容充电时有电流吗?),这里需要一个平衡。也就是滤波电容越大,二极管导通流过的电流越大,这个电流叫做冲击电流。 这里选择电容有一个经验公式: 半波整流  U1=0.45*U0 全波整流  U1=0.9*U0 当RL大于等于(3-5)T/2时,U2约等于1.2*U1。加了滤波后,负载电压大于整流出来的电压。 这里如果负载电流非常大时,通常认为大于一点几安培之上,这时二极管的平均整流值比较难以计算。就要考虑使用电感滤波,或是复式滤波。 电容滤波适用于负载电流较小(1.5A以下)且变化较小。

  • 发表了主题帖: 避免手机音频系统中的ESD静电干扰和电磁干扰EMI

          现代材料和技术引起静电放电(ESD)和电磁干扰(EMI),并成为经常存在的危险。我们的穿着和我们接触的物品会引起静电放电。数字技术已有电磁干扰。静电放电会破坏手机里的电子部件。手机容易替换,但对用户的伤害很大。手机电路设计者必须确保采取必要的措施,以消除ESD的破坏。   在音频电路中如有电磁干扰(EMI),会出现嘶嘶、噼啪、嗡嗡等声音,声音质量很差。手机用户无法忍受这样的干扰。因此,必须设法过滤音频电路的电磁干扰。   静电放电——起因、结果和抑制   起因   差不多每个人都经历过静电流的影响。当我们还是史前石器时代的穴居人时,我们已在闪电中见到过它。当然,它今天仍是重大的威胁,各处都有。用塑料梳子梳头,可看到静电荷的产生。将你的手臂靠近电视机的屏幕,你会看到你手臂上的汗毛竖起来。这也是静电效应。   当你打开车门,从你的车中走出,你也许会感受到一阵电击,它来自静电释放。随着家里和工作地点拥有越来越多的电器设备,静电已是一种持续的危险。制造或维修电气设备的人们要保护自己和工作用的设备,他们将自己与设备连接,用以避免电器设备静电放电造成的伤害。   结论   我们能看到闪电打击建筑物和树,它具有破坏力。如果电子电路的ESD保护不是最优,即使是很少的放电,也会破坏灵敏的电子电路,这是人们已探测到的。手机具有一定的ESD保护。音频电路的外部连接是ESD最常见的。简单地插入耳机及扩音器,这也许意味着手机将受ESD的影响。   如图1所示,电子部件受ESD影响时,会发生什么?会产生一个细微的孔,氧化物将侵扰部件。  http://file2.dzsc.com/data/19/04/18/9207_142828963.png  图1受ESD影响,氧化物冲进一个小孔   抑制   与所有的商品相同,手机必须根据IEC61000-4-2条例鉴定其ESD。条例规定:手机可抵抗15kV空气放电(通过330Ω/150pF),即大约不小于1毫微秒穿过45A电流。在这种情况下,手机应能继续工作,没有被破坏。上述是一个高能量脉冲与ESD人体模型实验的比较情况。为了保护主芯片,在每一潜在的ESD入口点都必须添加额外的ESD保护。一般来说,抑制ESD的设备生成可控输出,称作箝位电压。  http://file2.dzsc.com/data/19/04/18/9207_142839338.jpg  图2所示的是一次ESD事件中,ESD保护设备的输出(箝位电压)   电磁干扰EMI——起因、结果及滤波器   起因   电流流动,在导体周围产生磁场。电流变化,磁场会随之变化。所以,简单地开关电流,即会产生磁场的变化。磁场的变化可引发附近其他导体产生信号。上述是基本的电学原理。   家庭用电和工业用电均使用50Hz或60Hz交流电。这是听得见的频率范围。电流持续不断地变化,附近相同频率的导体将产生信号。如果你使用过Hi-Fi,使用独立的播放器和扩音器,而同时它们底盘未连接在一起,你将听到嗡嗡声。   思考当今电子世界,到处信号持续不断地变化:   ·音频的输入/输出能产生辐射及传导EMI,然后发射更高频率的射频线,导致信号失真。   ·手机天线(TDMA脉冲)会发射射频信号,此信号可被长线头戴式耳机接收,导致音频信号通路中EMI噪音。   GSM(全球通)手机标准使用频分多路传输和时分多路传输,同时传送大量电话,如图3所示。 http://file2.dzsc.com/data/19/04/18/9207_142853463.jpg  特定的手机只在属于它的时间空当发射。包络信号的基本频率是1/4.615ms=217Hz。谐波频率为434Hz、651Hz等。如此频率是听得到的。如图4所示,为手机的包络信号。   http://file2.dzsc.com/data/19/04/18/9207_142905338.jpg  结果   当手机与基站通讯,或两个手机彼此接近时,发射脉冲通过扩音器,扬声器,或头戴式耳机线传人音频通路。见图5。结果是音频质量大幅降低。  http://file2.dzsc.com/data/19/04/18/9207_142916135.jpg

  • 发表了主题帖: 为什么安卓手机不全都用Type-C接口

        手机从出现到现在发展了几十年,手机上的充电接口也从之前的单一充电的功能,变成了手机传输数据,充电,甚至耳机也改成插在了在充电接口。现在的手机接口主要有iPhone的lightning接口,安卓手机的Micro-USB以及Type-C接口。最近有朋友在问,为什么安卓手机不全都用Type-C接口呢      Type-C到底好在哪?      Type-C接口是最近几年流行起来的新一代的数据接口,像是三星,华为,小米等国内外的安卓旗舰手机采用这样的接口。另外,在新款的MacBook,戴尔XPS等等笔记本上也开始用Type-C作为数据接口使用。       为什么安卓手机不全都用Type-C接口 Type-C在性能上相比之前的Micro-USB要好很多,首先大家觉得Type-C好用的一点就是充电不需要考虑插头的方向。由于Type-C是一个对称的接口,不用考虑正反,充电的时候,尤其是晚上,不用考虑正反就能插进去,而且不会因为插反了而损坏手机尾插。 Type-C在功能上也是比Micro-USB要强,在用来充电的时候,Type-C最高支持100W的充电功率,充电速度可以大大提升。同时,Type-C还支持双向充电,不仅可以用Type-C的数据线给手机充电,还可以通过数据线用手机给其他手机充电。 还有就是Type-C在数据传输速度方面比原来有大幅的提升,据说最高传输速率可以达到10Gbps,相比于Micro-USB的速度提升了十几倍。      Type-C也有一些问题 Type-C虽然在性能上比较好,但是也有自己的问题。首先就是Type-C还不够普及,目前来看,绝大部分采用Type-C接口的都是旗舰级的手机,而手机销量主要还是在中高端和千元机,Micro-USB还是主力,想想在外面没带充电线的时候,你跟身边的人借充电线,然后全都不是Type-C,那时候就是很尴尬的了。 还有一点,就是Type-C虽然很强,但是目前大多数手机对于Type-C的使用还是在原来USB2.0的水平,也就是你买了辆奔驰开滴滴,虽然向下兼容,但是有些得不偿失。         Type-C为什么不普及? 说到这里就是揭晓为什么Type-C不普及的时候了,说到底一方面Type-C不像苹果的lightning一样,我苹果就用这个接口了,你们都得跟着我变。而Type-C的推广进展比较慢,用的人少,厂商就更愿意使用原本已经非常成熟的Micro-USB,真的有不少人卖手机的时候看到是Type-C就不选了的。 还有就是成本问题,在千元机中,很多设计都是延续了此前的模式的,如果换成了Type-C的接口,接口成本增加,手机的设计成本会增加,用户可能原本的数据线都用不了了买新的线一样有成本增加。所以依旧是很多厂商还在使用Micro-USB接口。 不过呢,在手机性能要求越来越高的时候,素质更好的Type-C应该会慢慢取代Micro-USB的,这也是需要各家厂商对于Type-C进行推广,比如目前销量比较高的几个品牌的手机,如果全都开始采用Type-C的接口,那么很快用户们使用Type-C的就越来越多了,之前说的  Type-C普及率不高的问题就不再是问题了。

  • 发表了主题帖: 如何检测开关电源变压器好坏?

    开关电源变压器   开关电源变压器是加入了开关管的电源变压器,在电路中除了普通变压器的电压变换功能,还兼具绝缘隔离与功率传送功能一般用在开关电源等涉及高频电路的场合。http://file2.dzsc.com/data/19/05/10/9207_142743398.jpg   开关电源变压器的作用与分类   开关电源变压器和开关管一起构成一个自激(或他激)式的间歇 振荡器,从而把输入直流电压调制成一个高频脉冲电压.http://file2.dzsc.com/data/19/05/10/9207_142755163.jpg   起到能量传递和转换作用.在反激式电路中, 当开关管导通时,变压器把电能转换成磁场能储存起来,当开关管截止时则释放出来. 在正激式电路中,当开关管导通时,输入电压直接向负载供给并把能量储存在储能电感中.当开关管截止时,再由储能电感进行续 流向负载传递.   分类   开关电源变压器分单激式开关电源变压器和双激式开关电源变压器,两种开关电源变压器的工作原理和结构并不是一样的。单激式开关电源变压器的输入电压是单极性脉冲,而其还分正反激电压输出;而双激式开关电源变压器的输入电压是双极性脉冲,一般是双极性脉冲电压输出。   开关电源变压器特性参数   电压比:指变压器的初级电压与次级电压的比值.   直流电阻:即铜阻.   效率:即输出功率/输入功率*100[%]   绝缘电阻:变压器各绕组之间及对铁心之间的绝缘能力.   抗电强度:变压器在1秒或1分钟之内能承受规定电压的程度.   开关电源变压器原理   对于开关电源,开关变压器的工作原理与普通变压器的工作原理是不同的。普通变压器输入的交流电压或电流的正、负半周波形都是对称的,并且输入电压和电流波形一般都是连续的,在一个周期之内,输入电压和电流的平均值等于0,这是普通变压器工作原理的基本特点;而开关变压器一般都是工作于开关状态,其输入电压或电流一般都不是连续的,而是断续的,输入电压或电流在个周期之内的平均值大多数都不等于0,因此,开关变压器也称为脉冲变压器,这是开关变压器与普通变压器在工作原理方面的最大区别。   通过PWM(脉冲宽度调制)控制开关管,将整流后的直流电压进行高频开关导通,使得高频电流流入开关电源的高频变压器原边,从而是变压器副边产生感应电流,经过整流后就可以得出需要的电压或多路电压。   开关电源变压器好坏检测详情   1、通过观察变压器的外貌来检查其是否有明显异常现象:   如线圈引线是否断裂,脱焊,绝缘材料是否有烧焦痕迹,铁心紧固螺杆是否有松动,硅钢片有无锈蚀,绕组线圈是否有外露等。   2、绝缘性测试:   用万用表R&TImes;10k挡分别测量铁心与初级,初级与各次级、铁心与各次级、静电屏蔽层与衩次级、次级各绕组间的电阻值,万用表指针均应指在无穷大位置不动。否则,说明变压器绝缘性能不良。   3、线圈通断的检测:   将万用表置于R&TImes;1挡,测试中,若某个绕组的电阻值为无穷大,则说明此绕组有断路性故障。   4、判别初、次级线圈:   电源变压器初级引脚和次级引脚一般都是分别从两侧引出的,并且初级绕组多标有220V字样,次级绕组则标出额定电压值,如15V、24V、35V等。再根据这些标记进行识别。   5、空载电流的检测:   a、直接测量法 将次级所有绕组全部开路,把万用表置于交流电流挡(500mA,串入初级绕组。当初级绕组的插头插入220V交流市电时,万用表所指示的便是空载电流值。   此值不应大于变压器满载电流的10%~20%。一般常见电子设备电源变压器的正常空载电流应在100mA左右。如果超出太多,则说明变压器有短路性故障。   b、间接测量法 在变压器的初级绕组中串联一个10/5W的电阻,次级仍全部空载。把万用表拨至交流电压挡。加电后,用两表笔测出电阻R两端的电压降U,然后用欧姆定律算出空载电流I空,即I空=U/R。F?空载电压的检测。   将电源变压器的初级接220V市电,用万用表交流电压接依次测出各绕组的空载电压值(U21、U22、U23、U24)应符合要求值,允许误差范围一般为:高压绕组≤±10%,低压绕组≤±5%,带中心抽头的两组对称绕组的电压差应≤±2%。   6、检测电源变压器的温度范围:   一般小功率电源变压器允许温升为40℃~50℃,如果所用绝缘材料质量较好,允许温升还可提高。   7、检测判别各绕组的同名端:   在使用电源变压器时,有时为了得到所需的次级电压,可将两个或多个次级绕组串联起来使用。采用串联法使用电源变压器时,参加串联的各绕组的同名端必须正确连接,不能搞错。否则,变压器不能正常工作。   8、电源变压器短路性故障的综合检测判别:   电源变压器发生短路性故障后的主要症状是发热严重和次级绕组输出电压失常。通常,线圈内部匝间短路点越多,短路电流就越大,而变压器发热就越严重。检测判断电源变压器是否有短路性故障的简单方法是测量空载电流。   存在短路故障的变压器,其空载电流值将远大于满载电流的10%。当短路严重时,变压器在空载加电后几十秒钟之内便会迅速发热,用手触摸铁芯会有烫手的感觉。此时不用测量空载电流便可断定变压器有短路点存在。   开关电源和变压器在用途上有什么区别?   开关电源:开关电源能很稳定的把一定范围之内的电压转为很精确的低压或高压(例如110V-250输入,输出电压可以稳定的控制在需要的电压正负不差0.5v)。   变压器:变压器的输出电压是随着输入电压不断变化着的,即输入电压增高输出电压也增加,输入电压降低输出电压也降低。   综上所述可得出结论开关电源是先将交流电变成直流电,直流电通过功率开关管再变成更高频率的交流电通过高频变压器进行电压转换不但效率提高而且频率高了之后大大缩小了体积,也节约了铜铁损耗。因为通过功率开关管控制所以在小电流时开关管导通的时间短,保持输出电压即可。负载大时开关管不停地工作保持输出电压。所以开关电源输出电压稳定,可以作为LED显示屏等高精度仪器选择。   综上所述开关电源目前应用的范围更加的广泛,更加的适应市场的需求,在了解了如上开关电源和变压器的区别后,也希望开关电源的各厂家能做好质量关,切勿因追求利益损害客户的利益。

  • 发表了主题帖: 如何选择DC-DC模块电源 DC_DC模块电源的重要性是什么

    一、序言   DC_DC模块电源越来越多的应用于通信、工业自动化、电力控制、轨道交通、矿业、军工等行业。而模块化的设计,可以有效的简化客户的电路设计,提升系统的可靠性和维护效率。那么,如何提升基于DC_DC模块的电源系统的可靠性?我们大部分时候想到的是选择一家品牌好的供应商提供高可靠的电源模块。然而,选择一款高可靠的电源模块,是否就意味着我们的电源系统非常可靠呢?本文就这个主题作简要分析与探讨。   二、为什么需要DC_DC模块电源?   DC-DC隔离模块电源主要应用于分布式电源系统中,用以对电源系统实现隔离降低噪声、电压转换、稳压和保护功能。使用DC-DC隔离模块电源的四大作用如下:   其一,模块电源采用隔离式设计,可以有效的隔离来自一次侧设备带来的共模干扰对系统的影响,使负载能够稳定的工作。   其二,不同的负载需要不同的供电电压,例如控制IC需要5V、3.3V、1.8V等;信号采集用的运放则需要±15V;继电器则需要12V,24V。而母线电压多为24V,因此需要进行电压转换。   其三,母线电压在长距离传输过程中会存在线损,故到PCB板级时电压较低,而负载需要稳定的电压,因此需要宽压输入,稳压输出。   其四,电源需要在异常情况下,保护系统的负载和本身不坏。   那么,如何选择DC-DC模块电源?   三、如何选择高可靠性的DC-DC模块电源   1. 采用成熟的电源拓扑   电源模块的设计尽量选用成熟的电源拓扑,这些拓扑已经经过时间的考验,成熟可靠。例如1-2W的定压输入DC-DC电源模块选择Royer电路,而宽压输入系列则多选Flyback拓扑,部分Forward拓扑。   2. 全负载范围内高效率   高效率意味着更低的功率损失和更低的温升,可以有效提高可靠性。在实际应用中,电源都会选择一定程度的降额设计,特别是在负载IC的功耗越来越低的今天,电源大部分时候都有可能在轻载情况下工作。因此,全负载范围内高效率对于电源系统可靠性来说是非常关键的参数,但往往被电源厂商忽略。大部分厂商为了技术手册上的参数吸引客户,往往将满载效率做到较高,但在5%-50%的负载情况下效率较低。   以金升阳的15W DC-DC模块电源VRB2412LD-15WR2为例,VRB2412LD-15WR2在额定电压24V输入时轻载10%的效率比主流同行水平高出15%,如图1和图2所示。   http://file2.dzsc.com/data/19/05/09/9207_133920926.png    通过效率的提升也可以有效的降低产品的外壳温升,VRB2412LD-15WR2在实际负载工作时的温升要低13.8度。   3. 极限温度特性   电源模块应用的地理区域非常宽广,可能有热带的酷暑也有类似俄罗斯冬天的严寒。因此要求DC-DC模块的工作温度范围最低要求为-40度~85度,也有做到更好的,例如金升阳的定压R2代1-2W工作温度可以做到-40度~105度。如果在汽车BMS、高压母线监测应用,则需要工作温度为-40度~125度,目前业界DC-DC模块只有金升阳的CF0505XT-1WR2的产品工作温度可以做到125度。   极限温度试验是最能检验电源模块可靠性的方法,例如高温老化、高温&低温带电工作性能测试、高低温循环冲击试验和长时间高温高湿测试等。正规的电源开发都会经过以上测试。因此,是否有此类测试设备也成为了判断电源厂商是否为山寨厂商的依据。   4. 高隔离、低隔离电容   医疗产品要求极低的漏电流,电力电子产品需要原边和次级之间尽量少寄生电容。这两个行业有一个共性的需求,即要求尽量高的隔离耐压,和尽量低的隔离电容,用以降低共模干扰对系统的影响。如果在医疗或电力电子应用,1-2W DC_DC建议选取隔离电容低于10pF左右的电源模块,宽压产品则尽量选取低于150pF的电源模块。   5. EMC特性   EMC性能是电子系统正常、安全工作的保证,目前电子行业对产品的EMC性能都提出了很高的要求,我们经常遇到客户抱怨因EMC处理不好导致系统的复位重启甚至是早期失效,因此优良的EMC特性是电源模块核心竞争力。   四、电源系统应用设计的可靠性   电源本身的可靠性固然重要,但是实际上,由于电源系统工作环境的复杂性,再可靠的电源如果没有可靠的系统应用设计,最终电源还是会失效。下面介绍几种常见的电源系统应用设计的方法和注意事项。   1. 冗余设计技巧   在可靠性要求高的场合,要求电源模块即使损坏,系统也不能断电。此时,我们可以采取冗余供电的方式来提升系统的可靠性。如下图所示,当一个电源模块损坏时,另外一个模块可以继续供电。图3为其中一种常见的冗余设计方案。  http://file2.dzsc.com/data/19/05/09/9207_134101477.png  注意事项:D1、D2建议使用低压降的肖特基二极管,以避免二极管的压降影响后端系统的工作,并注意选取二极管的耐压值要高于输出电压。这种方法会产生额外的纹波噪声,需外接电容来减小纹波或是加滤波电路。   2. 降额设计   众所周知,降额设计可以有效提高电源工作寿命,但是负载过轻使用,电源的性能又无法工作在最佳状态。 例如,金升阳DC_DC模块电源建议在负载范围30%~80%内使用,此时各方面性能表现最佳。   3. 合理外围防护设计   电源模块应用行业非常多,应用的环境要求也不近相同,因为其通用性设计,DC-DC模块电源仅能满足通用共性需求。因此当客户的应用环境要求苛刻时,需要加适当的外围电路来提升电源的可靠性。   以金升阳的20W DC-DC铁路电源URB24XXLD-20WR2为例,单独模块只能通过EN50155 1.4倍输入电压Vin的1S测试,但因为体积原因没有办法通过RIA12的标准,通过添加外围电路(也可以选择金升阳EMC辅助器FC-AX3D),就能通过RIA12要求的3.5Vin/20mS的等测试要求。 因而合理的外围电路设计可以使模块满足更高等级的技术规格,使之适应更恶劣的应用环境,提升电源模块的可靠性。   4. 散热设计   工业级的电源模块的损坏大约有15%是因为散热不良导致的,电源模块是朝着小型化和集成化方向发展,但是很多应用场合电源是处于密闭的环境中连续工作的,如果积热无法散出去,电源内部的器件可能因为超过热应力而损坏。通常的散热方式有自然风冷、散热片散热和加强制性散热风扇等。热设计的几点经验分享如下:   (1) 电源模块的对流通风http://file2.dzsc.com/data/19/05/09/9207_134122554.png  对于依靠自然对流和热辐射来散热的电源模块,周围环境一定要便于对流通风,且周围无大器件遮挡,便于空气流通。   (2) 发热器件的放置   如果系统中拥有多个发热源例如多个电源模块,相互之间应尽量远离,避免相互之间热辐射传递导致电源模块过热。   (3) 合理的PCB板设计   PCB板提供了一种散热途径,在设计时就要多考虑散热途径。例如加大主回路的铜皮面积,降低PCB板上元器件的密度等,改善模块的散热面积和散热通道,例如电源模块应尽量垂直放置如图4,可以使热量尽快向上散发;如果将DC-DC模块放在PCB的底部,则向上散发的热量会被PCB阻挡,导致产品积热无法散发出去。   (4) 更大封装尺寸和散热面积   同样功率的电源,如果可能尽量选择尺寸更大的封装和散热面更大的散热器,或者使用导热胶将电源模块外壳与机壳连接。这样电源模块拥有更大的散热面积,散热会更快,内部的温度会更低,电源的可靠性自然也就越高。   5. 匹配性设计、安规设计   电源的输入走线尽量保持直线,避免形成环路天线吸引外界辐射干扰。同时输入线和输出线需要按照UL60950的安规要求保持合适的间距,避免耐压失效。再者,电源底板下禁止布线,特别是信号线,电源变压器的电磁线会对信号形成干扰。   另外一个设计师需注意的是,需要关注一次电源和二次电源之间,以及电源与系统工作频率的倍频错开,避开相互之间的系统匹配性问题。   五、小结   DC_DC电源模块的可靠应用需要电源原厂提供高品质电源,同时也需要设计工程师合理的应用设计,只有从设计和应用双向考虑才能最终获得可靠的电源系统。

  • 2019-05-19
  • 发表了主题帖: 记第一次dsp项目的失败经历

          事情要从去年开始说起了。去年暑假做完电赛,自我感觉对单片机的了解和应用足够之后,便开始了新一段的学习。那时候我选择了DSP,其实现在的我还是很佩服当时我的选择的,毕竟当时整个科协还没人学DSP,我只能在全校找学DSP的同学。就是这时候我认识了五系的黄杰学长,在这里要对黄杰学长表示由衷的感谢,因为他对我的学习提供了很大的帮助。也是在他的帮助下,我算是踏入了DSP的大门,开始学习2812,相当于DSP的入门级片子。     当我学了一段时间2812之后,感觉不到它和单片机的分界,尽管它具备很多单片机所没有的特性,但我还是没有那种踏入一个新的世界的感觉。也许这就是为什么外界说C2000都是高级点的单片机的原因吧。    以后我便放下了2812,开始学另一种高级的DSP-C5000。也就是从这时候开始,我产生了用它做项目的想法。经过一段时间的商议和不断的上网查论文资料。我和老翟准备一起做一个家居智能小车。主要功能是用机械小车载着一个摄像头,把摄像头采集到的数据经过解码以后通过wifi传到互联网,再到另一端进行数据的编码,并把图像显示到液晶上。另外还增加了几个附属模块,第一个是利用GSM模块控制小车的移动,就是可以用手机短信控制小车的前进后退,第二个是利用红外模块进行对家用电器的控制。     这里说一下,当这个方案完全定型的时候,就已经到了14年寒假了。我觉得这个方案就为我们这次项目失败埋下了伏笔。因为软件任务太多了,可能是我们选定的项目偏向软件的原因。现在想来我应该再找一个软件一起做。不过这个还不算是我们失败的根本原因,因为到现在软件任务最难的部分已经完成了,但是毁在了细节上。     之后就是不断的方案和器件选型的调整。首先我们想到的是用侯老师提供的达芬奇套件进行图像处理,暑假的时候也对这个套件进行了几天的研究。但是后来发现尽管这个套件很适合做这个项目,但是没有仿真器。这就是很纠结的一个问题了,ti官网有卖仿真器,但是花费要好几K,所以我们只能放弃了这种套件。另换了另一个C6000的套件。这个套件最终也没有被采用,因为这种DSP缺少我们进行视频处理的视频接口,而且没有解码电路。这样说吧,我们进行嵌入式软件开发重要的是有一个稳定可靠的平台,如果我们把我们辛苦敲好的代码在一块不稳定的电路上运行,结果发现不能运行,那我们就不知道究竟是硬件还是软件的问题。这是一个非常恶心的问题。     经过这一番波折之后,就已经到了大二下开学了,到了这一步算是走投无路的我得知了我们学校以为研究生导师那里有很多图像处理套件。我马上决定给老师打电话,我清楚的记得我当时给老师说的是:”陈老师您好,我是八系的李浩哲,我想用dsp做图像处理,但是没钱买套件,请问您能不能借我一套,可以的话我就给您干活,不能的话就算了。”为什么这么说。因为我也明白这样的套件对于每个研导来说都是不多的,几万一套的套件,我不敢肯定他能不能拿出来给一个完全不了解的本科生去用。所以我只能这么说。所幸的是陈老师很慷慨,直接让我去找他,并和我聊了很多,之后我便顺利借到了图像处理套件。     回忆起来,这段时间是我整个做项目的这三个月最顺利收获最大的一段时间,也是在这里我真切的了解了图像处理,并调试出了这个部分。在这里对陈老师表示真挚的感谢,谢谢!     接下来就准备调试wifi.模块,这里还是遇到了之前的问题。具体问题涉及项目比较深我就不多说了。最终我们还是放弃了wifi这个模块,准备固定摄像头在一个地方(之前确定的是车载摄像头),用网线传输数据,在网页上查看视频。因为这个技术现在比较成熟了,所以我调的很顺利。接下来便剩下了GSM模块,最后的问题也出在这里。     在这里不得不说到我的心态问题,或许是走到这一步我已经把整个项目最重要也是最困难的一部分完成了,剩下的附属模块我便轻浮的以为不值一提了。也是从这时候开始有了松懈。在这个时候就已经四月中旬了(四月三十号之前交作品),最后调试GSM模块的时候我没有仔细看用户手册,直接上手调,用上位机控制GSM,成功;用单片机和上位机通信发指令,成功;最后用单片机连接GSM控制收发短信。失败。     我们的项目进程此时卡在了这里,程序没问题,板子没问题,连一块就是不好使。为了这个问题我们连着包了两天宿,我跟老翟尝试了各种电路各种猜想结果还是不行。最后我们舍弃了串口直接跳线连接单片机和GSM,好使了。     当天晚上我们开开心心回寝室之余,我还在思考为什么调试通过了。结果是我也不明白。因为通过这两晚的摸索我对这个电路也有了系统的了解,但是还是不明白为什么调试通过了。但是事实就是好使了,我便没有在意。     第二天中午,我来到实验室,接着调试,还是好使。我清空了一下液晶,添加了显示短信的程序,开始联调。准备调试完整给老翟看看。写完程序之后,再上电,发现整个系统已经烧了。     接下来我们查电路查了好久。还是不明白为什么会烧。当天晚上老翟看到电路背面有标注,大致意思就是板子和上位机通信要怎么跳帽,和单片机通信要怎么跳帽。     事情到这里就明了了。我们终于明白了为什么之前的调试不通,可是板子已经烧了。     当时是4月27号,距离交作品还有两天。     当晚我们系科委开会,因为我和老翟都是科委,都一起去了。到了会议室谁都没心思听。就接着商量以后的事。老翟问我假如调好GSM之后,车载的红外模块好使了没有。     到这里我才想起来之前我们找一个大一的学弟帮我们做红外模块,但是到现在他早就不干了。我也没有在意这件事。觉得这个模块简单,应该不是问题。到现在才想起来。晚了。     太浮躁。     除了在项目开始的时候我系统的想过这个项目以后,我就没有再现在系统的角度看过这个项目。只是着眼于局部,直到调完最困难的模块以后这个错误的观点被我无限放大。觉得剩下的都是小事,没问题。     然后我们最后就折在了小事上。     突然想起来这个问题好像不是第一次犯了。去年省赛的时候也是,当我完成了整个软件系统的时候,同样开始了松懈,没有太在意剩下的细节。最后在测评的时候被老师抓住一个bug扣了两个指标的分。最后只拿了二等奖。     千里之堤,溃于蚁穴。      整个项目做到这里在我眼里就已经是失败中的失败了。坑了队友,觉得很对不起。但是这至少也是一个教训,一个惨痛的教训。不要狂,不要心浮气躁,不要觉得你完成了大部分就可以轻松。你需要用百分之三十的努力完成前百分之七十,再用百分之七十的小心完成最后百分之三十。 失败了,或许有点后悔,但是无所谓。我们还年轻,还有好多年。我们还有足够的精力去战斗。痛定思痛,我觉得这次收获很大,大于这次比赛带来的奖。或许今年的国家立项要无缘了。当做教训吧,希望记清楚这次教训。 后记:这篇文章大概是二十七八号写的,当时板子还是烧的,之后我没办法,去找陈老师借来了研究生实验室的DSP套件,因为之前也调过,直接调通了网络摄像头部分,准备直接拿着这个去糊弄糊弄完事了。那时候才感觉到毕竟人有时而力穷,一直以来觉得自己意志力算是比较强大的了,但是在一次次现实的冲击和愧疚面前自己还是软弱了一把,记得当时我是连借一块GSM都懒得借了。之后还是陈捷听说我板子烧了,马上找舍友借了一块给我用。     从手里拿到这个模块开始到现在,大概是意识到自己之前意料之外的软弱,算是知耻后勇吧,一口气把系统程序调通了,两天大约睡了两个小时,今天中午坐在地上调着调着直接睡过去了。醒了之后调完程序又去考了个试,到现在。     不得不承认这次项目给了我很多的经验教训,有时我也会在心中假如,假如我没有得水痘住十多天院,假如我不是科协主席,假如我没有办单片机讲座,那么我能做到的高度肯定比现在高得多。但是没有如果,发生的已经发生了,你现在站到的位置就是你必须捍卫的位置。我不会因为这些事去觉得可惜,我悔恨的是我的大意和松懈。很多时候面对很多人,你对他唯一的作用就是你能为他创造多大的价值,而你如果想为别人创造更大的价值,你自己的能力就不能只是单方面的,为将而不通天文,不知奇门,不晓阴阳,不看阵图,不明兵势,是庸才也。你有一块短板,就注定你会在该挡风的时候漏风,该挡雨的时候漏雨,不管你长板有多长,你就是庸才。所以你必须完善自身。为了别人,也为了自己。

  • 发表了主题帖: 基于DSP的汉字及图形叠加实现

          分享一篇很多年前的笔记,可以给同学们演示一下如何把数字和模拟结合到一起,形成一些创新。只有真正的把原理和基础消化吸收,通过应用实践,才能转化为自己可以掌握的创造力。 基于DSP的汉字及图形叠加实现 项目简介:     传统的字符叠加都是使用专用的OSD芯片,一般价格较高,而且通常只能实现英文字母和数字的叠加,使用不灵活,还要占用较多的PCB板空间,故障率也较高。     这里介绍的字符叠加方案是基于TI的2000系列DSP的,经过调试验证效果良好。     TMS320F2812是TI新近推出的高性能定点DSP,内部集成的EV模块使它很适用于高性能的电机控制应用场合。如要求高精度、高速的云台和机床等。以云台为例,通常需要随着电机的运转显示角度、坐标、距离等信息,以及一些简单的控制菜单,甚至可能要叠加简单的地图。用通常的OSD芯片根本无法完成如此复杂的涉及任意图形的叠加。而该叠加方案巧妙利用了2812的内部资源――SPI串口模块,实现了这些内容的叠加。叠加原理:      图形叠加是把视频信号的每一行虚拟分成H个点,垂直分为V行,叠加图像就是H×V分辨率的单色位图。利用视频信号提取出的复合同步信号及场同步信号,确定叠加图像的有效点(即需要覆盖掉原视频图像的点),在这些点把视频信号切换到一个固定电平(可以由DSP控制)即可实现视频叠加。方案实现:该功能模块主要由四部分组成:复合视频信号交流耦合及直流恢复、视频同步信自成提取、视频叠加灰度控制、视频切换叠加。下面对各部分及软件实现做简要的描述。1) 复合视频信号交流耦合及直流恢复      视频信号交流耦合可以对前后级形成有效的隔离以起到很好的保护作用。但交流耦合后的复合视频信号会丢掉原信号的直流分量,导致丢失一部分背景亮度信息。而交流耦合带来的最严重的问题是:信号直流成分的丢失会导致同步头的上下漂移,使信号同步信息丢失。http://c.51hei.com/a/a/g/659174935471.jpg 图1交流耦合视频信号示意图        从图1可以看到交流耦合后的信号是趋于平均电平对齐的,对不同亮度背景的信号,同步头电平差异很大,无法通过与一个固定的参考电平进行比较来提取同步信息。       于是需要对信号进行直流恢复,这里采用三极管钳位电路(图2)。三极管钳位电路具有成本低、控制灵活、响应速度快等优点。这里钳位电路起到的作用就是将视频信号的低电平自动(即同步信号)对齐。为使峰值1V的视频信号比较适合后续3.3V供电系统作处理,将视频信号的低电平设置为1.1V(高电平为2.1V,相对3.3V电源,上下均有1.1V左右的电平裕量),于是R29与R30分压为1.1V+0.7V=1.8V。由此确定R29与R30值分别为4.7K和3.6K。 http://c.51hei.com/a/a/g/65917503542291.jpg 图2直流恢复-钳位电路 恢复后的视频图像如图所3示: http://c.51hei.com/a/a/g/65917503575632.jpg 图3直流恢复后的视频信号示意图 这样便完成了视频信号的直流恢复。可以很容易的用简单比较器电路提取同步信息。另外,采用钳位电路的另一个好处是,75欧负载是在耦合电容前面,耦合电容后面的本地视频信号所在的网络阻抗很大(约30K),只需要1uF的磁片电容就可以实现视频信号的良好耦合――有效带宽与75欧电阻配400uF电解电容相当。这就大大缩小了耦合电容的体积,并提高了电容寿命。2) 视频同步信号提取       复合同步主要用于行同步,比较容易提取,只需要一个简单的积分滤掉高频杂波,然后经过一个比较电路就能得到。传统的场视频信号提取是利用滤波和微分电路实现的,那种方式不容易实现场同步信号与复合同步信号的严格对齐,会造成叠加内容的上下抖动。这里使用了一种其它的方法――利用前面得到的复合同步脉冲里的槽脉冲经过一点简单的处理即可得到场同步信号。因为槽脉冲的宽度为29.65us,而行同步头宽度只有4.7us。所以用一个积分电路和一个比较电路就能由复合同步信号提取出场同步信号――图4的R35和C48就是该积分电路,时间常数取介于4.7us与29.65us之间的15us(时间裕量较大),于是取值分别为15K与1nF。另外,通过计算还找到一个合适的值,使场同步信号提取与复合同步信号提取使用同一个参考电平以减少元器件。提取的同步脉冲直接送到2812的中断输入引脚。图4为同步信号提取电路图:http://c.51hei.com/a/a/g/65917503518251.jpg 图4同步脉冲提取电路 比较器不需要速度很快,只需延迟时间一致就可以,于是采用低成本的双路比较器LM2903。3) 视频叠加灰度控制http://c.51hei.com/a/a/g/65917503586691.jpg 图5叠加灰度控制电路       视频叠加是通过快速在视频图像与灰度电平之间切换实现的。图像背景不同,往往需要改变叠加内容的灰度才能达到理想的视觉效果。于是利用2812剩余的一路PWM信号积分后代替DA来产生灰度电平(两个电机控制使用4个PWM脚,还剩余2个)。初步积分地需选用前面的数字地,以保障流畅的PWM信号回路(数字部分)。对1MHz的PWM信号,可以取R26、C45的值为1K与0.1uF,使输出纹波低于5mV。然后再经过一级针对模拟地的RC滤波,使输出灰度电平纹波达到uV级。4) 视频切换叠加      叠加通过一个视频切换芯片来实现,为减少原视频信号失真,选用TI的带宽达300MHz的视频切换芯片TS3V330,并且使用两路并连以提高导通电阻的一致性。该芯片通道切换时间低于10ns,可以很好的满足应用需求。具体电路如下图6所示:http://c.51hei.com/a/a/g/65917503535621.jpg 图6切换叠加电路叠加功能中视频信号与固定电平的切换是通过DSP自带的SPI口完成的。2812的SPI最大传输比特率为37.5Mb/s,并且SPI模块自带16级16位的FIFO。这里显示水平分辨率H刚好可以取256,可以满足一般显示应用需求,而且刚好能利用SPI模块的FIFO实现每行仅进行一次SPI写操作,极大的减少了CPU占用时间。DSP每次检测到复合同步脉冲触发的硬件中断,进行一次对SPI FIFO写的操作,检测到场同步中断即进行行数清0的操作。按照每64us进入中断进行一次16字(16bit*16)的搬移计算,CPU占用量不及1%。      垂直分辨率V取256,奇偶场不需区分――也就是相邻帧的同一行叠加内容相同,这样在满足应用需求的前提下可以减少奇偶场判断所需的软件资源。对PAL制和NTSC制信号,可以取V的一部分,即有效叠加内容少于256行。我们采用的DSP(TMS320F2812)内带128k×16bit的FLASH和18k×16bit的RAM。利用64k的FLASH装载一级汉字库及ASC字形库和一个4k的自定义LOGO或其它图形。其余64k装载程序。为减少字符叠加及叠加内容维护占用DSP的计算量,给字符叠加专门分配一块4k×16bit的RAM作为OSD缓存。只有叠加内容需要更改的时候才对RAM内容进行写操作。5) 软件部分     该方案所需的软件涉及的内容较少也比较简单。主要是两个中断函数,里面执行一些简单的行数处理和对SPI FIFO的写操作。另外还涉及一些字符处理的子函数,如在某个位置叠加/清除一个字符以及满屏图像叠加和清屏等。这些子函数是对RAM内图形缓冲进行写操作,对实时性要求很低,管理起来也很方便。项目结述:     目前该方案的软硬件都已经实现,占用DSP资源少,效果良好,字符稳定。不会影响电机控制,DSP还有非常大的计算裕量。单字符及图形叠加模块增加的成本只有不足5RMB,极大限度的利用了2812的剩余资源。该方案也可修改后用低成本的单片机实现。http://c.51hei.com/a/a/g/65917503589650.jpg 图7最终叠加效果图

  • 发表了主题帖: DSP仿真器驱动安装错误导致的报错及处理

        使用的合众达510仿真器,安装完仿真器驱动后可以用驱动安装包带的usb20emurst.exe来复位仿真器,但是进行CCS3.3后connect开发板会报下面的错误。 Error connecting to the target: Error 0x80000240/-172 Fatal Error during: Initialization, OCS, This error was generated by TI's USCIF driver. SC_ERR_REG_DETECT_SPRT <-172> The wrong support-logic address value has been used. A controller cannot be detected even though the selected port does match the hardware configuration. The standard 560 ports are 0x0, 0x1, 0x2 and 0x3. The standard EVM ports are 0x0, 0x1, 0x2 and 0x3. The standard DSK ports are 0x378, 0x278 and 0x3BC. The standard 510 ports are 0x240, 0x280, 0x320 and 0x340. I/O Port = 240 Board Name: C64xx SEEDXDS510USB  Emulator Cpu Name: TMS320C6400_0 Abort:            Close Code Composer Studio. Retry:             Try to connect to the target again. Cancel:           Remain disconnected from the target Diagnostic:     Run diagnostic utility. 选择“retry”出下面报错信息 Error connecting to the target: Error 0x80002240/-121 Fatal Error during: Initialization, OCS, Control, This error was generated by TI's USCIF driver. SC_ERR_CMD_HANDLE <-121> A bad controller handle has been given to a function, either before attempting to open the controller, or after having opened the controller and ignored its error status. Valid controller handles are generated when attempts to open the controller return a clean error status. I/O Port = 240 Board Name: C64xx SEEDXDS510USB  Emulator Cpu Name: TMS320C6400_0 Abort:            Close Code Composer Studio. Retry:             Try to connect to the target again. Cancel:           Remain disconnected from the target Diagnostic:     Run diagnostic utility.       出现这种情况一般是仿真器驱动没有装好,可以查看“..CCStudio_v3.3\cc\bin”路径下的“xdsfast3.dll”文件,如果这个文件是160K大小那么驱动就是没有装好的。如果出现这样的问题,即使重装驱动往往也不能成功。    需要删除该“xdsfast3.dll”文件,然后断开PC和仿真器,重新装仿真器驱动。安装后查看“xdsfast3.dll”文件大小为352K即表示驱动安装成功。

  • 发表了主题帖: DM6437向DSP/BIO中增加硬中断的方法

          64+的中断系统和以往的不同,中断是基于事件的。整个硬件CPU接收15个中断,但中断源可以支持最多128个。64+将中断源视为事件"Event",128个事件可以分别通过配置连接到15个CPU中断。而128个事件每连续32个可以合并到四个固定的事件中,即Event0(对应事件号0-31)、Event1(对应事件号32-63)、Event2(对应事件号64-95)、Event3(对应事件号96-127)(实际最大有效中断源为124个)。这样可以通过数量有限的CPU中断来管理大量的中断源,使用灵活。        DSP/BIOS默认将Event0-3分别对应到HWI_INT7-10四个中断号。TI驱动通过注册Event到这四个事件,进而对应到相应中断。在中断HWI_INT7-10服务函数中再去判断具体是哪个事件触发的中断。        另外还有几个中断是系统硬件复位中断、NMI中断、预保留中断及仿真通讯中断。HWI_INT4-6、HWI_INT13、HWI_INT15这5个中断是未使用中断。用户增加中断服务的话,可以将事件号对应到这5个中断来实现。       以T1高32位定时中断为例,介绍一下DM6437应用中如何在DSP/BIOS操作系统中实现硬件中断。首先用户需要将T1配置为双32位定时器,T1高32位定时器中断服务函数为 T1HIsr()。将事件对应到中断HWI_INT5。      1 在DSP/BIOS图形配置界面下打开"Scheduling"->"HWI-Hardware Interrupu Service"。     2 下拉表中有15个中断。观察各中断使用情况。右键点击"HWI_INT5",弹出下拉菜单中选"Properties"进入中断属性编辑栏。在"General"栏中,"interrpu selection number"项填入事件号"7"(6437数据手册中有中断源对应的事件号)。"function"项填入中断服务函数名"_T1HIsr"(需在C语言编写的函数前加下划线)。然后点"应用","确定"即可退出。 http://c.51hei.com/a/old/up/0/481919303411650.jpg     注:一些人说还要在"Dispatcher"中勾选"Use Dispatcher"前的复选框。那是复合事件Event0-3才需要的,所以HWI_INT7-10四个中断里的"Use Dispatcher"需要勾上。如果用户定义的新中断不是使用复合事件而是使用单一事件触发的话不需要勾选。但勾选的话不会影响使用。因为新中断未使用Event0-3。     3 在应用程序中使能中断。如"C64_enableIER( 1 << 5 )" 使能中断HWI_INT5。     4 编写中断服务函数"void T1HIsr()"。     注。仿真器通讯中断可能对新中断有影响,有可能导致中断表现不正常。可以在"release"下编译,以减少仿真引起的大量中断。

  • 发表了主题帖: Cortex M3系列GPIO口介绍(工作方式探讨)

    一、Cortex M3的GPIO口特性       在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置。 http://c.51hei.com/a/old/up/0/4913650162956.jpgCortex M3结构框图    从图中可以看出,GPIO口都是接在APB总线上的,而且M3具有两个AHB到APB桥,GPIO则直接接在AHB矩阵上,这样可以减少CPU和DMA控制器之间的竞争冲入,获得较高性能。APB总线桥配置为写缓冲区,使得CPU或DMA控制器可直接操作APB外设,而无需等待总线写操作完成。M3数字I/O功能:   高速GPIO口,其寄存器被移到外设AHB总线,可以字节,半字和字寻址。 位电平置位和清零寄存器允许单指令置位和清零一个端口的任意位。 所有GPIO口寄存器支持M3位带操作。 整个端口值可以用一条指令写入。 GPIO口寄存器可由GPDMA控制器进行访问,可以进行DMA数据操作,使之与DMA请求同步。 单个I/O口方向可以控制。 所有I/O口在复位后默认作为上拉输入。(Why?因为微控制器连接了很多设备,如果复位后作为输出,则由于控制器电平状态不定,可能会导致外围设备产生动作,从而产生不利影响,故复位后一半都作为输入状态。) M3可产生中断的数字端口: PORT0 和 PORT2 端口的每个引脚都可以提供中断功能; 每个端口上的中断可被编程为上升沿、下降沿或边沿产生中断; 边沿检测是异步的,因此可以在没有时钟的情况下(例如掉电模式)操作。使用这种特性,就无需电平触发中断; 可掉电唤醒; 寄存器为软件提供挂起的上升沿中断、挂起的下降沿中断和整个挂起的 GPIO中断; GPIO0 和 GPIO2 中断与外部中断 3 事件共用相同的 NVIC 通道。 二、GPIO口的寄存器描述 Cortex M3引脚的寄存器描述: http://c.51hei.com/a/old/up/0/4913650147812.jpg PINMODEx表示引脚模式选择寄存器,在使用前要配置好。 引脚模式选择寄存器位PINMODEx功能复位后的值00引脚使能上拉电阻0001中继模式10引脚无片内上拉或下拉电阻11引脚使能下拉电阻 中继模式说明:当引脚处于逻辑高电平,中继模式能使能上拉电阻;当引脚处于逻辑低电平时,中继模式会使能下拉电阻,这样当引脚配置为输入且没有外部驱动时,能够保持上一个已知状态。 PINSELx:功能选择寄存器。用来设定PORT引脚的功能,当PINSELx各位为0时,才用作GPIO 端口。 FIOxDIR:GPIO口方向寄存器,单独控制每个端口管脚的方向,可作为字节(8位),半字(16位)和字长(32位)的数据进行访问。 FIOxMASK:屏蔽寄存器。任何写、读的操作只在该寄存器对应位为“0“时才有效。 FIOxPIN:管脚值寄存器。只要管脚不配置为ADC,其他所有方式都可以从该位读出端口当前的实际状态。注:如果读FIOPIN寄存器,那么不管物理引脚的状态如何,在 FIOMASK 寄存器中被“1”屏蔽的位将始终读出0。 FIOxSET:输出引脚的状态。写 1 使相应的端口引脚产生高电平。写 0 没有影响。读该寄存器返回端口输出寄存器的当前内容。只可以更改 FIOMASK 中为 0 的位,即非屏蔽位。 FIOxCLR:控制输出引脚的状态。写 1 使相应的端口引脚产生低电平。写 0 没有影响。只可以更改 FIOMASK 中为 0 的位,即非屏蔽位。 2.1  GPIO端口方向寄存器FIOxDIR(FIO0DIR??FIO4DIR- 0x2009 C000??0x2009 C080)          当引脚被配置为 GPIO功能时,该寄存器可用来控制引脚的方向。勿必根据引脚功能来设置每个引脚的方向。 注:GPIO引脚 P0.29和P0.30 与USB D+/-引脚共用,并且具有相同的方向。如果FP0DIR位29或位30在FIO0DIR寄存器中被配置为零,则P0.29 和P0.30都为输入。如果FP0DIR位29和位30被配置为1,则P0.29和P0.30都为输出。 高速GPIO端口方向寄存器位描述位符号值描述复位值31:0(字长数据)FP0DIRFP1DIRFP2DIRFP3DIRFP4DIR0 1控制的引脚为输入引脚控制的引脚为输出引脚0 字和半字的操作基本类似,只是可以通过8位寄存器或者16位的寄存器分别控制方向而已,这里不再解释,请参看《深入浅出Cortex-M3 LPC1700》.2.2  GPIO端口输出设置寄存器FIOxSET(FIO0SET??FIO7SET - 0x2009 C018??0x2009 C098) 当引脚在输出模式中被配置为 GPIO 时,该寄存器在端口引脚产生高电平输出。向该寄存器的某些位写入“1”时,对应的引脚产生高电平。写入“0”无效。如果需要引脚输出低电平或第二种功能,那么写 1 到 FIOxSET 的相应位无效。 读FIOxSET 寄存器返回该寄存器的值,该值由前一次对 FIOxSET 和 FIOxCLR(或前面提到的 FIOxPIN)的写操作确定,它不反映任何外部环境对 I/O引脚的影响。 通过 FIOxSET 寄存器访问的端口引脚受到 FIOxMASK 寄存器相应位的限制。 高速GPIO端口输出设置寄存器位描述位符号值描述复位值31:0(字长数据)FP0SETFP1SETFP2SETFP3SETFP4SET0 1控制的引脚输出不改变 控制的引脚输出被设为高电平 0 2.3  GPIO端口输出清零寄存器FIOxCLR(FIO0CLR??FIO07CLR - 0x2009 C01C??0x2009 C09C) 当引脚在输出模式中被配置为 GPIO 时,该寄存器在端口引脚产生低电平输出。向某些位写入“1”会使相应的引脚产生低电平,同时清零 FIOxSET 寄存器的相应位。写入“0”无效。如果引脚被配置为输入或其它功能,那么写 FIOxCLR 对引脚没有影响。 通过FIOxCLR寄存器访问的端口引脚受到FIOxMASK寄存器相应位的限制. 高速GPIO端口输出清零寄存器位描述位符号值描述复位值31:0(字长数据)FP0CLRFP1CLRFP2CLRFP3CLRFP4CLR0 1控制的引脚输出不改变 控制的引脚输出被设为低电平 0 2.4  GPIO端口引脚值寄存器FIOxPIN(FIO0PIN??FIO7PIN- 0x2009 C014??0x2009 C094) 该寄存器提供了端口引脚的值,可配置这些值来执行仅为数字的功能。该寄存器将给出引脚的当前逻辑值,而不管引脚是否配置为输入或输出,或作为 GPIO或作为其它可选的数字功能。 例如,特殊的端口引脚可能具有 GPIO输入、GPIO 输出、UART 接收和 PWM 输出等可选功能。无论该引脚配置成何种功能,都可以从相应的 FIOxPIN 寄存器中读出其当前的逻辑状态。 如果引脚配置为模拟功能,当选择了模拟配置时,引脚状态不能被读出。将引脚选择用作A/D输入会断开与引脚数字部分的连接。在这种情况下,从 FIOxPIN 寄存器中读出的引脚值无效。 写 FIOxPIN 寄存器时, FIOxPIN 寄存器的值会保存到端口输出寄存器,而无需使用 FIOxSET和 FIOxCLR寄存器来获得整个写入值。由于这种特性影响整个端口,因此在应用中时要小心。 通过 FIOxPIN 寄存器访问的端口引脚受到 FIOxMASK 寄存器相应位的限制。 只有在屏蔽寄存器中用0 屏蔽的引脚与高速 GPIO 端口引脚值寄存器的当前内容相互关联。 高速GPIO端口引脚值寄存器位描述位符号值描述复位值31:0(字长数据)FP0VALFP1VALFP2VALFP3VALFP4VAL0 1控制的引脚输出设为低电平 控制的引脚输出设为高电平 0 2.5  高速GPIO端口屏蔽寄存器FIOxMASK (FIO0MASK??FIO7MASK - 0x2009 C010??0x2009 C090) 该寄存器用来屏蔽某些端口引脚,被屏蔽的引脚将无法通过 FIOxPIN、 FIOxSET 或 FIOxCLR寄存器写访问。当读FIOxPIN 寄存器时,屏蔽寄存器还将过滤相应端口的内容。 通过读或写访问,该寄存器中为“0”的位使能相应物理引脚的访问。如果该寄存器中的位为“1”,则相应位将不会通过写访问改变,并且读操作时将不会在更新的 FIOxPIN 寄存器中反映出来。 高速GPIO端口引脚值寄存器位描述位符号值描述复位值31:0(字长数据)FP0VALFP1VALFP2VALFP3VALFP4VAL0 1控制的引脚输出设为低电平 控制的引脚输出设为高电平 0 2.1  GPIO端口方向寄存器FIOxDIR(FIO0DIR??FIO4DIR- 0x2009 C000??0x2009 C080)          当引脚被配置为 GPIO功能时,该寄存器可用来控制引脚的方向。勿必根据引脚功能来设置每个引脚的方向。 注:GPIO引脚 P0.29和P0.30 与USB D+/-引脚共用,并且具有相同的方向。如果FP0DIR位29或位30在FIO0DIR寄存器中被配置为零,则P0.29 和P0.30都为输入。如果FP0DIR位29和位30被配置为1,则P0.29和P0.30都为输出。 高速GPIO端口方向寄存器位描述位符号值描述复位值31:0(字长数据)FP0DIRFP1DIRFP2DIRFP3DIRFP4DIR0 1控制的引脚为输入引脚 控制的引脚为输出引脚 0 字和半字的操作基本类似,只是可以通过8位寄存器或者16位的寄存器分别控制方向而已,这里不再解释,请参看《深入浅出Cortex-M3 LPC1700》.2.2  GPIO端口输出设置寄存器FIOxSET(FIO0SET??FIO7SET - 0x2009 C018??0x2009 C098) 当引脚在输出模式中被配置为 GPIO 时,该寄存器在端口引脚产生高电平输出。向该寄存器的某些位写入“1”时,对应的引脚产生高电平。写入“0”无效。如果需要引脚输出低电平或第二种功能,那么写 1 到 FIOxSET 的相应位无效。 读FIOxSET 寄存器返回该寄存器的值,该值由前一次对 FIOxSET 和 FIOxCLR(或前面提到的 FIOxPIN)的写操作确定,它不反映任何外部环境对 I/O引脚的影响。 通过 FIOxSET 寄存器访问的端口引脚受到 FIOxMASK 寄存器相应位的限制。 高速GPIO端口输出设置寄存器位描述位符号值描述复位值31:0(字长数据)FP0SETFP1SETFP2SETFP3SETFP4SET0 1控制的引脚输出不改变 控制的引脚输出被设为高电平 0 2.3  GPIO端口输出清零寄存器FIOxCLR(FIO0CLR??FIO07CLR - 0x2009 C01C??0x2009 C09C) 当引脚在输出模式中被配置为 GPIO 时,该寄存器在端口引脚产生低电平输出。向某些位写入“1”会使相应的引脚产生低电平,同时清零 FIOxSET 寄存器的相应位。写入“0”无效。如果引脚被配置为输入或其它功能,那么写 FIOxCLR 对引脚没有影响。 通过FIOxCLR寄存器访问的端口引脚受到FIOxMASK寄存器相应位的限制. 高速GPIO端口输出清零寄存器位描述位符号值描述复位值31:0(字长数据)FP0CLRFP1CLRFP2CLRFP3CLRFP4CLR0 1控制的引脚输出不改变 控制的引脚输出被设为低电平 0 2.4  GPIO端口引脚值寄存器FIOxPIN(FIO0PIN??FIO7PIN- 0x2009 C014??0x2009 C094) 该寄存器提供了端口引脚的值,可配置这些值来执行仅为数字的功能。该寄存器将给出引脚的当前逻辑值,而不管引脚是否配置为输入或输出,或作为 GPIO或作为其它可选的数字功能。 例如,特殊的端口引脚可能具有 GPIO输入、GPIO 输出、UART 接收和 PWM 输出等可选功能。无论该引脚配置成何种功能,都可以从相应的 FIOxPIN 寄存器中读出其当前的逻辑状态。 如果引脚配置为模拟功能,当选择了模拟配置时,引脚状态不能被读出。将引脚选择用作A/D输入会断开与引脚数字部分的连接。在这种情况下,从 FIOxPIN 寄存器中读出的引脚值无效。 写 FIOxPIN 寄存器时, FIOxPIN 寄存器的值会保存到端口输出寄存器,而无需使用 FIOxSET和 FIOxCLR寄存器来获得整个写入值。由于这种特性影响整个端口,因此在应用中时要小心。 通过 FIOxPIN 寄存器访问的端口引脚受到 FIOxMASK 寄存器相应位的限制。 只有在屏蔽寄存器中用0 屏蔽的引脚与高速 GPIO 端口引脚值寄存器的当前内容相互关联。 高速GPIO端口引脚值寄存器位描述位符号值描述复位值31:0(字长数据)FP0VALFP1VALFP2VALFP3VALFP4VAL0 1控制的引脚输出设为低电平 控制的引脚输出设为高电平 0 2.5  高速GPIO端口屏蔽寄存器FIOxMASK (FIO0MASK??FIO7MASK - 0x2009 C010??0x2009 C090) 该寄存器用来屏蔽某些端口引脚,被屏蔽的引脚将无法通过 FIOxPIN、 FIOxSET 或 FIOxCLR寄存器写访问。当读FIOxPIN 寄存器时,屏蔽寄存器还将过滤相应端口的内容。 通过读或写访问,该寄存器中为“0”的位使能相应物理引脚的访问。如果该寄存器中的位为“1”,则相应位将不会通过写访问改变,并且读操作时将不会在更新的 FIOxPIN 寄存器中反映出来。 高速GPIO端口引脚值寄存器位描述位符号值描述复位值31:0(字长数据)FP0VALFP1VALFP2VALFP3VALFP4VAL0 1控制的引脚输出设为低电平 控制的引脚输出设为高电平 0 对于常见的ARM处理器,它们的GPIO口基本上可以配置为输入模式、输出模式、开漏或推挽模式,对于新唐的M0来说,所有I/O都处于准双端模式;对于NXP的M3处理器来说,GPIO可以配置为上拉、下拉、开漏或者中继模式。     开漏输出与推挽输出的区别:推挽输出: 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。可以输出高,低电平,连接数字器件,正常的拉出/灌入电流为4mA,短时间极限值可以达到40mA,但不是每个引脚都能输出这么多开漏输出:输出端相当于三极管的集电极。要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内).开漏电路概念中提到的“漏”就是指MOS FET的漏极。同理,开集电路中的“集”就是指三极管的集电极。开漏电路就是指以MOS FET的漏极为输出的电路。一般的用法是会在漏极外部的电路添加上拉电阻。完整的开漏电路应该由开漏器件和开漏上拉电阻组成。组成开漏形式的电路有以下几个特点:   1. 利用 外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up,MOSFET到GND。IC内部仅需很小的栅极驱动电流。如图1。   2. 可以将多个开漏输出的Pin,连接到一条线上。形成 “与逻辑” 关系。如图,当PIN_A、PIN_B、PIN_C任意一个变低后,开漏线上的逻辑就为0了。这也是I2C,SMBus等总线判断总线占用状态的原理。   3. 可以利用改变上拉电源的电压,改变传输电平。IC的逻辑电平由电源Vcc1决定,而输出高电平则由Vcc2决定。这样我们就可以用低电平逻辑控制输出高电平逻辑了。   4. 开漏Pin不连接外部的上拉电阻,则只能输出低电平(因此对于经典的51单片机的P0口而言,要想做输入输出功能必须加外部上拉电阻,否则无法输出高电平逻辑)。 http://c.51hei.com/a/old/up/0/4913559586927.jpg 问题集锦一、准双向IO结构的特点是 1 输出结构类似 OC门,输出低电平时,内部NMOS导通,驱动能力较强(800uA);输出高电平靠内部上拉电阻,驱动能力弱(60uA)。 2 永远有内部电阻上拉,高电平输出电流能力很弱,所以即使IO口长时间短路到地也不会损坏IO口 (同理,IO口低电平输出能力较强,作低电平输出时不能长时间短路到VCC) 3 作输入时,因为OC门有"线与"特性,必须把IO口设为高电平(所以按键多为共地接法) 4 作输出时,输出低电平可以推动LED(也是很弱的),输出高电平通常需要外接缓冲电路(所以LED多为共阳接法) 5 软件模拟 OC结构的总线反而比较方便-----例如 IIC总线 * OC门:三极管的叫集电极开路,场效应管的叫漏极开路,简称开漏输出。具备"线与"能力,有0得0。 * 为什么设计成输出时高电平弱,低电平强----是考虑了当年流行的TTL器件输入 二、IO不同模式的区别? 简单的说: “准双向IO口”在读前必须先用写指令置"1",才能读入;写则无须此步. “真正的双向IO口”可直接读写. “三态IO口”有高,低电平,高阻状态,高阻本人理解:相当此脚与内部电路断开.

  • 发表了主题帖: ARM CORTEX-M3 内核架构理解归纳

    Cotex-M3内核的主要包括:嵌套向量中断控制器(NVIC),取值单元,指令译码器,算数逻辑单元(ALU),寄存器组,存储器映射(4GB统一编址各区域功能的划分与界定),对于开发者而言,其实主要关注的主要分为三大块: 1、寄存器组2、地址功能划分映射3、中断机制(NVIC)。 1)寄存器组 Cortex-M3内核共有19组32位寄存器: R0——R12(通用寄存器); 低寄存器组R0——R7 32位Thumb-2指令与16位Thumb指令均可访问 高寄存器组R8——R12 32位Thumb-2指令与极少数16位Thumb指令可访问 R13(堆栈指针寄存器);      主堆栈寄存器MSP(main-SP)/进程堆栈寄存器PSP(Process-SP)同一时间只能使用其中一个。MSP供操作系统内核及中断(异常)处理子程序使用,PSP只供用户的应用程序代码使用(详细使用详见3、嵌套向量中断控制器(NVIC)的总结)。      堆栈指针是4字节对齐的,故最低两位永远是00; R14(连接寄存器)      用于存储程序返回的地址及PC的返回地址; R15(程序寄存器)指向当前程序执行的地址; 2)特殊功能寄存器组 xPSR(程序状态字寄存器组),32位,可分为三个寄存器分别进行访问,也可以PSR或xPSR的名字直接组合访问。      应用程序PSR(APSR)      中断号PSR(IPSR)      执行PSR(EPSR) 中断屏蔽寄存器 PRIMASK    单一比特位,置位后,除NMI与硬fault外,其他中断都不响应; FAULTMASK  单一比特位,置位后,除NMI外,其他中断都不响应; BASEPRI     共有9位,中断号小于等于该寄存器设置值的中断都不响应; 控制寄存器control Control[0] 0决定特权级线程模式;1用户级线程模式; Control[1] 0主堆栈;1进程堆栈; 控制寄存器只能在特权级模式下改写,handler模式永远是特权级,且只允许使用主堆栈MSP 复位后,处理器进入特权级+线程模式下; 2、地址功能划分映射 Cortex-m3是一个32位处理器,其地址总线、数据总线都是32位的,故可在4G的地址范围上资源寻址。Cortex-m3内核把4G空间划定了基本的框架,定义不同的使用用途。 0x0000 0000 ----0x1FFF FFFF(512MB) 该区域为code区(flash区),供指令总线与数据总线取指取数使用;可以执行指令; 0x2000 0000 ----0x3FFF FFFF(512MB) 该区域为片上SRAM区,芯片制造商可在此布设RAM,可以将代码复制到此处运行,该区域也是可以执行指令code的;低1MB空间可位寻址,通过位带别名可扩展为32Mb的位寻址。 0x4000 0000 ----0x5FFF FFFF(512MB)该区域为“片上外设”区,主要为片上外设的相关寄存器,即特殊功能寄存器区,同理低1MB也可位寻址;该区域不可执行代码; 0x6000 0000 ----0x9FFFFFFF(1G)该区域为片外RAM区,该区域可执行代码; 0xA000 0000 ----0xDFFFFFFF(1G)该区域为片外外设区,该区域不可执行代码; 0xE000 0000 ----0xFFFFFFFF(1G)该区域为系统区,该区域不可执行代码; 所以不同地址片段的起始地址可简记为:0,2,4,6,10,E, 该系统区又分为两部分: 内部私有外设区0xE000 0000 ----0xE003FFFF(256KB)主要有NVIC,FPB,DWT,ITM等 外部私有外设区0xE004 0000 ----0xE00FFFFF(512+256=768KB)有ROM表,ETM,TPIU等 数据的大小端模式:CM-3既支持大端模式也支持小端模式,其中对于大端模式,ARM7中使用的是字不变大端模式,CM3中则为字节不变大端模式。虽说大小端模式都支持,但依然建议在绝大多数情况下使用小端模式,如果一些外设是大端模式,可以通过REV/REVH指令便可轻松完成端模式的转换。 3、中断机制(NVIC) 既然称之为MCU而非MPU,那么就是以控制为主,控制的一个关键指标就是实时性,能够及时对变化的情况作出反应,而这主要是通过中断机制来完成的,可以说除却运算性能,cortex-M3内核的主要修为都体现在控制的实时性上——也即中断的即时响应机制。 CM3对中断是怎么定义的呢? 一个是CM3内核异常导致当前运行程序的中断,一个是外部事件引入导致的。 系统异常主要是CM3内核层面的,复位,NMI,硬fault,这三者优先级固定且最高,此外还有总线fault、内存管理fault、用法fault等,svc系统调用服务、systick等的优先级可以通过编程来设定;这些都放在一个向量表里,存储的是中断服务函数的入口地址,32位,共256项,前16个是系统内的中断,除去保留位,系统中断共有16-5-1=10个,剩余240个外部中断IRQ,其中有三个的优先级是固定的:复位,NMI,硬fault,中断号分别为-3,-2,-1,中断号越小,优先级也就越高,其他优先级都是可编程的。此外,对于复位启动过程,M3内核的MCU与传统的单片机复位是不一样的,传统的单片机是直接从地址0处开始运行,然后再执行地址0处的跳转指令,跳转到设定的程序起始段;而CM3复位后首先是在地址零处0x00000000取出主堆栈MSP的初始值,(因为CM3的堆栈是向下生长型的,所以这个初始值一般设为RAM区的末地址+1,以保证堆栈足够大,再啰嗦下,比方说RAM区为0x20000000——0x3FFF FFFF那么初始值就设置为0x40000000);然后通过复位中断号找到存放复位程序入口地址的地址单元(0x00000004),地址单元(0x00000004)存放着第一条指令执行的地址(0x00000100)并赋给PC,PC就从这个地址里存放的指令依次执行。关于指令执行的地址需要严重关切:CM3运行在thumb状态,所以加载到PC中的值的最低位LSB必须置1,以区别ARM状态(ARM为偶数),所以若想指向0x00000100的地址值,中断向量表中存的复位程序入口地址应为0x00000101,用0x00000101表示0x00000100,这里不要把存储数据的地址和PC的指向地址搞混,只有PC的执行地址LSB不能等于0,其他总线访问地址则没有此限制。(为了把问题解释清楚,啰嗦的我自己都受不了了)为什么要首先初始化堆栈MSP呢?因为在复位的过程中也可能发生中断,例如NMI,硬fault等。 中断从发生到结束主要需要经过以下这么几个步骤:1捕获并响应中断,2现场保护,3中断程序入口,4返回。下面就根据这个脉络来总结cortexM3在提高中断响应速度方面所涉及的重要知识点(这个讲解顺序针对已具备一定的基础人员): 说到中断必涉及到优先级、涉及到嵌套,在CM3中用8位来编程中断的优先级数,可实现256级优先级,其中这8位又分为两段,一段决定抢占优先级的级数,一个决定亚优先级的级数,其中规定抢占优先级不得少于3位(8级优先级),亚优先级最少不得少于1位,所以抢占优先级在M3中最多128级,在哪一位开始分组由NVIC中的寄存器中(应用程序中断及复位控制寄存器)的PRIGROUP来决定;但实际中,芯片制造商一般只使用最高几位,比如5位,高三位(7,6,5)编程抢占优先级,剩下的两个次高位(4,3)用来决定亚优先级,从第4位处作为亚优先级的分组,这里通过一个分组寄存器来决定从哪一位做亚优先级分组。 优先级确定好了,那么在众多不同优先级的中断面前,CM3又是以什么样的机制来提高响应速度的呢?这就需要表一表在响应之前,处理器必须要做的工作——现场保护即保护当前的程序运行环境,依次入栈以下8个寄存器:程序状态寄存器XPSR,程序计数器PC,返回地址寄存器LR(连接寄存器),R12,R0——R3,这些都是硬件自动完成的。如果当前正在使用堆栈,则压入相应的堆栈寄存器MSP/PSP值,当前在用PSP就压入PSP,反之则压入MSP,进入中断服务程序就将一直用MSP了;好了,请注意,提高中断的响应速度就在这些寄存器的入栈顺序上,我们知道,堆栈是建立在片上RAM中的,通过系统总线(systemcode)来操作(为什么要建立在RAM上,因为堆栈需要不停地做出栈、入栈等动作,需要不断改变存储的值,而flash或rom只在烧写的时候写入数据),指令是存放在flash中的即code区通过指令总线(codebus)来操作,所以在入栈的时候先压入xPSR的值,再压入PC的值,压入PC的值后,就可以通过指令总线,根据中断向量号取出中断服务函数的地址赋给PC新的指令地址,进行指令的预取,而堆栈仍然可以通过系统总线继续压入其他寄存器的值,与取指令操作并行不悖,互不干扰,加快了中断的响应速度。相关寄存器可查询权威手册。 在响应中断前所做的准备工作都做好了,那么当众多中断前来叫门时,应该如何以最短的延时处理一系列的中断呢?第一级中断自不必说,根据中断号来进行仲裁,当发生中断嵌套的时候,CM3中的一些响应机制就能加快整个中断响应过程的速度了,低优先级由于高优先级中断的抢占而处于挂起状态,当高优先级中断处理完毕,按照传统的嵌套中断处理流程,高优先级中断处理完成后应该出栈弹出内容,然后再入栈压入先前弹出的内容,再处理被挂起的低优先级中断,按书中所说,这就是砸锅炼铁再铸锅的过程,完全没有必要,于是CM3内核在处理一系列嵌套的中断时,总共只执行一次入栈,出栈工作,这样处理连续的几个嵌套中断时,就减少了很多环节,缩短了时间,尤其是嵌套级别计较深的时候,尤为明显。但是要注意的是:不要嵌套太深,因为每嵌套一级就至少入栈8个32位的寄存器值(32B),如果本身就是中断进程,当前代码正在使用堆栈,还要将堆栈的值再入栈,这样无疑加大了堆栈的存储压力,如果用穿堆栈,发生溢出,程序十有八九就跑飞了,是很危险的,所以在应用中,要尽量减小中断的嵌套深度。 之前的中断响应机制发生在高级中断打断低优先级中断完成响应之后,译者将其名曰:咬尾中断;下面的中断则发生在高优先级中断打断低优先级中断准备响应之时,当高优先级中断还没来的时候,低优先级中断已经把前期准备工作给做完了,这时候高优先级中断来了,那么此时高优先级中断会直接利用低优先级中断的前期工作成果,直接开始响应,进入服务中断服务程序,而之前的低级中断则被迫挂起,为别人做嫁衣了,没办法,内核就是这样规定的,译者将其译为“晚到(的高优先级)异常”我将其名为“后来居上”中断。 中断延迟时间:从检测到中断,到执行中断服务程序的第一条指令,其间所流逝的时间。 书中云:如果存储系统足够快,入栈与取指令可以分别进行,且中断可以即刻得到响应不被抢占,那么所耗费的时间就是固定的12个周期(满足硬实时要求的确定性)。如果多级嵌套中断响应,算上咬尾中断省去的出入栈时间,每个中断可减少至6个周期。 最后再说说异常即fault,内核活动层面的东西,这个本应是需要大书特书的东西,尤其是在调试程序的时候找bug上,是体现一个人技能水平的很重要的方面,但是限于时间与研究深度,暂时不深究了, 就一句话吧:运行时出现的系统错误有时候不是编程上的语法错误,如果不了解内核架构和一些使用准则,是很难发现bug在哪里,这就需要追溯到底是程序运行到哪里出了问题,导致内核运行出现了错误,得益于CM3完备的调试架构,很多fault的产生都会被监测到,并记录在对应的寄存器中,按图索骥就知道问题出在哪里,是哪条指令导致的,借此针对性的自查、分析、修改。

  • 发表了主题帖: 怎么看时序图--nand flash的读操作详解

    这篇文章不是介绍 nand flash的物理结构和关于nand flash的一些基本知识的。你需要至少了解 你手上的 nand flash的物理结构和一些诸如读写命令        操作的大概印象,你至少也需要看过 s3c2440中关于nand flash控制寄存器的说明。         由于本人也没有专门学过这方面的知识,下面的介绍也是经验之谈。        这里 我用的 K9F2G08-SCB0 这款nand flash 来介绍时序图的阅读。不同的芯片操作时序可能不同,读的命令也会有一些差别。        当然其实有时候像nand flash这种 s3c2440内部集成了他的控制器的外设。具体到读写操作的细节时序(比如 CLE/ALE的建立时间,写脉冲的宽度。数据的建立和保持时间等),不明白前期也没有多大的问题。        因为s3c2440内部的nand flash控制器 做了大部分的工作,你需要做的基本就是设置 几个时间参数而已。然后nand flash会自动进行这些细节操作。        当然如果处理器上没有集成 nand flash的控制器 那么久必须要自己来写时序操作了。所以了解最底层的时序操作总是好的                 但是上层一点的,比如读写操作的步骤时序(比如读操作,你要片选使能,然后发命令,然后发地址,需要的话还需发一个命令,然后需要等待操作完成,然后再读书数据)。        是必须要明白的。这都不明白的话,怎么进行器件的操作呢                 也就是说 s3c2440 可以说在你设置很少的几个时间参数后,将每一个步骤中 细微的操作都替你做好了。(比如写命令,你只要写个命令到相应寄存器中,cpu内部就会协各个引脚发出        适应的信号来实现写命令的操作)。        而我们所需要做的 就是 把这些写命令,写地址,等待操作完成。等步骤组合起来 。从而完成一个 读操作                 就像上面说的,虽然我们不会需要去编写每个 步骤中的最细微的时序。 但是了解下。会让你对每个操作步骤的底层细节更加明了                 先来看一个命令锁存的时序。也就是上面说的 读 nand flash操作中不是有一个 写命令步骤吗。那么这个步骤具体是怎么实现的。        首先 我们肯定是要片选 nand flash。只有选中芯片才能让他工作啊        nand flash是通过 ALE/CLE (高电平有效)来区分数据线上的数据时命令(CLE有效),地址(ALE有效)还是数据(CLE/ALE都无效)。        那么这里既然是写命令 那么就一定是 CLE有效(高电平) ALE无效(低电平)。        同样命令既然是写给nand flash的那么 肯定有一个写周期。我们需要注意的是,写是在上升沿有效还是下降沿有效。        时序图如下: http://c.51hei.com/d/forum/201409/12/023212bb2kcvaoozcqkzoz.jpg         1 这里是命令锁存是时序,那么我们要注意的其实就只有 CLE 为高电平期间这段时序。(写命令啊,CLE有效时(高电平)指示现在的数据其实命令)ALE此时一定为低电平我们可以不关心他        2 所以,CLE为 低电平的时期,其他大部分引脚上都是 灰色的阴影,这代表我们不需要关心这段时期这些引脚的电平        3 那么 这个数据是什么时候被nand flash读取到的呢, 注意到 nWE信号 在上升沿有一个贯穿所有其他引脚时序的竖线(这好像是叫生命线?我也不清楚)               这就是说明,写入的数据(命令也是数据啊,只是可以通过CLE有效来区分)是在 WE的上升沿有效。               也就是说,虽然 WE是在低电平有效,但并不是说 WE一变成低电平,命令就被锁存了(即真正获得命令)而是在 WE 的上升沿,命令才真正被锁存。                 知道了上面这三点,也就知道了一个大概,那么剩下的图中也只剩那些 txx 的标号。明显它指的是时间,但是具体指什么时间呢。        指的就是箭头两边所指的两条 竖线之间的时间。(在每个信号的跳变沿,都有小竖线)                 剩下的就是这些时间到底是代表什么了。这里没什么难的,刚接触的觉得看不懂。是因为之前从来没接触过。(就像单片机刚学的时候不也是各种不懂,原因就是我们从没接触过)。 这些时间标号,在数据手册的前面都有 说明        http://c.51hei.com/d/forum/201409/12/023213virl6i69r996isly.jpg         比如  tCLS   tCLH 从数据手册中我们可以看到 分表代表的 CLE建立时间,和CLE信号保持时间。        简单点你可以理解为,我让 CLE引脚  变成高电平,总得给人间一点时间去变成高电平吧。总不能瞬间就变成高电平        不过从 时序图中我们能看到更多的端倪,之前不是说过 WE 的上升沿上不是有一个最长贯穿其他信号线的竖线吗。我们说他指示了,数据(命令也是数据)        是在上升沿被锁存的,在 WE 的上升沿,我写到数据线上的命令数据才真正被锁存(接收),但是 我们注意到 CLE 信号在WE上升沿之前有就有效了。        所以我们说, 在命令数据真正被锁存之前,CLE 有效的那段 tCLS 时间叫做 CLE信号建立时间。               WE上升沿后。命令已经被接受了,但这时候 CLE 其实可以变为无效了,因为已经获取到命令了        但是他并没有立刻结束,而是 Tclh时间之后才结束。那么我们 称这段 时间 tCLH 为 CLE 保持时间。         那么再根据手册中的说明  tCS 表示 片选信号建立时间,tCH表示片选信号保持时间               tDS表示数据建立时间,tDH表示数据保持时间                 这里我们看到一个小规律,在数据手册中 以 S 结尾的时间通常指的是建立时间, 以 H 结尾的时间指的是保持时间                                    这里命令锁存的时序就分析完了。我们再来看看  地址锁存时序图,这个图有点复杂,        因为nand flash的 特性是 地址周期通常需要好几个,就是一个地址是分几次发送的        http://c.51hei.com/d/forum/201409/12/023213ascchhhe2nhoh21z.jpg                  再给出数据手册中对应时间标号的说明        http://c.51hei.com/d/forum/201409/12/023213t2toxhkm735khyzo.jpg          同样我们按照上面分析的步骤        1 这里是地址锁存是时序,那么我们要注意的其实就只有 ALE 为高电平期间这段时序。(写命令啊,ALE有效时(高电平)指示现在的数据其实是地址)CLE此时一定为低电平,可以不用管         2 所以,ALE 为低电平的时期,其他大部分引脚上都是 灰色的阴影,这代表我们不需要关心这段时期这些引脚的电平         3 同样 WE 的上升沿有一个贯穿其他信号线的长竖线,这也是代表数据(这里其实是地址)在上升沿被锁存                 那么剩下的也好理解        tCLS 这个我们不需要关心,因为 CLE 压根就是无效的。        tCS 就像之前分析的,它是指 CE片选信号在 WE上升沿也就是锁存地址之前的有效时间,也就是 CE 建立时间        tWC 呢? 不知道? 不知道 看手册啊,前面也说过这些时间标号在手册中都会给出。               从上面手册的解释我们看到,它指的是一个写周期的时间        tWP 写脉冲宽度(也就是 WE是低电平有限,twp指低电平持续时间,就是有效时间)        tWH 好理解了,就是高电平时间        ALS    这不就是 地址信号  ALE 建立时间嘛        ALH   ALE信号有效保持时间啊        TDS TDH 数据建立和保持时间        就像上面对 命令时序的分析,这里 信号的 建立 和 保持时间都是以 数据被 锁存分界点(WE上升沿)                 看到这里相信仔细看的人,应该大致该如何看一个时序图了,但是这里 我们牵涉到的 无非都是一些 上面 建立/保持时间。        复杂点的呢。                 下面就来看一个复杂点的时序图,其实也不复杂,主要是说明如何在不看手册就能知道 txx指的是什么时间          http://c.51hei.com/d/forum/201409/12/023213j285v3ezij3ro3i8.jpg                          这个时序其实并不复杂,只是他不是像上面分析的那样都是一些 建立时间和保持时间。这里牵涉到跟多的时间标号        不过就像前面说的. 看手册! 手册里对每个时间参数都有说明。不过初学者通常即使看手册,对这些时间参数也是不知道是什么意思。        这里我们看手册前,先来自己分析下。方法会了,手册就成了验证你对不对的东西了,而不是你寻找答案的东西。                 TRC 这个参数有点简单。看他的范围 是 一个 RE周期 的时间,那么就跟前面的 tWC 应该是一样的。那它应该代表的就是 RE信号的一个周期时间(读信号的一个周期)        TREA 呢? 看标号看不出所以然,那么我们就看他的起始和结束时间 从时序图能看到,这个指的是从 RE有效(变低) 到数据出现之间的时间。        那么tREA 可想而知就应该是 读信号有效到数据被读之间的时间        后面的都是这个同样的分析方法        比如最后的那个 tRHZ 是从 RE 无效(高电平)到数据线变成高阻态 之间的时间(数据线画在中间表示的是高阻态)        看下手册中的解释 也基本就是这个意思        http://c.51hei.com/d/forum/201409/12/023213e8vm2vy2semzum1m.jpg                  到这里 对于时序图怎么看,相信大家都应该能理解了。甚至可能连手册都不用看,就知道他是什么意思了。因为我们能从 时间的起始地址来推测时间标号的意思                          上面这些分析,都是很底层的操作,如果我们使用 s3c2440 这种高级的处理器 这些时序操作我们根本不需要去实现,顶多也就往几个寄存器中        设置一下上面说的一些时间 然后,CPU 中的 nand flash控制器会自动完成上面所的所有操作。但是还需要了解的原因是,如果你碰到一个没有        nand flash 控制器的处理器 怎么办,那你只能亲自实现这些 具体的 写命令,写地址。等等 单元操作。        然后才能将这些单元操作组合成 读数据,写数据等操作(上面说过 比如读操作 他并不是一个简单的命令而是一系列操作,你要片选使能,然后发命令(读命令),        然后发地址(要读的数据的地址),需要的话还需发一个命令,然后需要等待操作完成,然后读书数据)                 说完了 这些具体的单元操作,那么我们再来看看一个 读操作 具体需要哪些步骤。也就是我们需要真正必须掌握的时序操作        对于我这款 nand flash 读操作时序如下        http://c.51hei.com/d/forum/201409/12/023213gp8o37m85pffximo.jpg         我们要注意的主要是 最下面一行 即 I/Ox 信号线的状态,他指示了 读操作需要哪些,单元步骤。        1 首先 我们看到 有一个 0x00 是什么?数据?地址?命令? 看 ALE/CLE线啊,这两根线不是决定了现在的数据的类型嘛        顺着往上看,我们知道0x00是在 CLE有效期间的数据那么它就是一个命令        2 然后是 address(5Cycle) 即五个地址序列(这款nand flash 指定读数据的地址时要发送五个地址序列),往上看,是在ALE有效期间的数据,那么应该就是地址了               (对于这五个地址,前面两个是列地址,后面三个是行地址。在nand flash的物理结构中 行地址对应的某一页,列地址就对应这一页中的某一列)                 3 接着又是 0x30,此时 CLE有效,那么就是命令了(也就是说这款nand flash的读操作需要两个命令)。               但是之后数据并未立刻出来,我们看到在到 DATA Output即数据输出之前还有一段时间,为什么有这段时间?               往上看 R/nB 这个数据线上说明了原因,这段时间内它是低电平 即指示现在 处于 忙碌状态,还未准备好数据输出。为什么会这样?               因为你 写了 一个命令,写了要读数据的地址,又写了一个命令。 你总要给 cpu一些时间去处理这些命令吧,               R/nB为低电平这段时间就是 在处理这些命令(实际上是根据命令将你定位的那一页数据读到内部寄存器中),        等 R/nB变成高电平了,就指示命令处理完毕,现在数据也就可以读出来了。                 综上我们从手册中我们就知道了读操作的具体步骤,        1 首先nand flash 也是一个外设,要访问他就需要片选它,所以在执行时序图上的步骤之前需要片选nand flash.        2 看后面就是安装时序图来了,看时序图! 第一步先是发送一个命令 0x00.        3 看时序图! 然后发送五个地址序列(先发送两个列地址,在发送三个行地址(即页地址))        4 看时序图! 接着再是一个命令 0x30.        5 看时序图!  R/nB 引脚为低表示现在正忙,正在处理这些命令,那就要等待 R/nB 引脚变为高电平        6 看时序图! 这个时候就可以读数据了        7 一次读操作结束了 nand flash 暂时是不需要使用了,那么别忘了应该 取消片选信号。                 至于这每一个步骤中具体的时序,cpu中的nand flash控制器会帮我们完成。我们要做就是设置几个时间参数                 这里我们反复强调了要看时序图。其实学嵌入式前期对数据手册一定要多看,看多了你就回知道,什么东西的你重点要看的,什么是和你的编程操作无关的你不需要关心。这样后面你才能,拿到一个外设 就能写出他的操作。而不用跟着书背步骤。只要手册在就行了。                 上面的步骤,是一个具体的读操作的步骤,不过在使用一个器件之前我们需要初始化一下它。至于初始化也就是设置我们上面多次提到的        我们说过 s3c2440已经帮我做了很多底层的单元操作,我们只需设置几个时间参数 片内的 nand flash就会自动发出相应操作的时序操作        那么到底设置那几个时间呢。        s3c2440 手册上给出了 需要我们设置的几个参数。         http://c.51hei.com/d/forum/201409/12/023213cz3hhs7nhcnncshh.jpg                   http://c.51hei.com/d/forum/201409/12/023214lstsa6rl5gp4rlrz.jpg         从中我们可以看出 第一幅时序图是 命令和地址锁存的时序,第二幅是 数据读取和写入的时序。 可以看出,他们要设置的时间都是一样的。前面分析了那么多,这里应该不难 看出         1 TACLS 很明表示的是 CLE/ALE 的建立时间(这里并不准确,其实是 CLE/ALE有效到 WE 变成低电平之间的时间,但 WE 却是在上升沿才锁存命令/地址)        2 TWRPH0 代表的是 WE 的脉冲宽度,即有效时间        3 TWRPH1 代表的是 CLE/ALE 的保持时间         那到底设置成什么数字呢。既然 上图中读/写/命令/地址 操作需要的时间参数都是一样的        那么我们从 nand flash中随便找一个 命令时序来对照不就行了        就拿上面我们说过的 命令锁存时序来对比         http://c.51hei.com/d/forum/201409/12/023214asmse6iwyumsuvwz.jpg          那么我们就能得到下面的关系        TWRPH0 = tWP        TWRPH1 = tCLH        TACLS  = tCLS - tWP          然后设置成多少呢? 看手册啊,手册中对 tWP  tCLH  tCLS 都会至少给出 需要的最小时间         这款芯片nand flash手册中这三个参数要求是         http://c.51hei.com/d/forum/201409/12/023214eyyfcdeyqq9yy9k2.jpg         所以 TWRPH0 = tWP  >=12ns                TWRPH1 = tCLH >=5ns                TACLS  = tCLS - tWP >=0;        而这三个参数在s3c2440的数据手册中说明为         http://c.51hei.com/d/forum/201409/12/023214vkroy3ykg41wnz7m.jpg         当然这里的时间都是以 HCLK 为单位的,这几个参数 是在 nand flash控制寄存器中的 NFCONF中设置的        这里我没用使用MPLL 所以HCLK是 12MHZ                 所以 TWRPH0 = 0 TWRPH1 =0 TACLS =0; (如果你的时钟频率比较高,那就要设别的数了。当然有是有你真不知道,设置大点总没错,只不过速度可能会慢点。)               所以 NFCONF =0;(NOFCONF其他位数据手册中有说明,这里只是简单读操作,其他位可以不设置)                 然后是初始化一下 ECC 使能nand flash控制器(我们只是设置了几个时间参数,时序的具体操作就是靠他来完成的,所以要使能他)        然后先 取消片选nand flash 因为我们现在还没有操作它啊,只是初始化一下。所以还是应该先取消片选,等真正读的时候再使能片选信号                 NFCONT = (1<<4) | (1<<1) (1<<0);        (数据手册中有对应位的说明)         最后,第一次使用nand flash 我们需要复位操作一下。        综上,nand flash 的初始化代码如下        void nand_init(void){                NFCONF =0;                NFCONT = (1<<4) | (1<<1) | (1<<0);                nand_reset();  //nand reset代码在后面        }                 下面代码一些地址的写法是与 nand flash 型号有关的。具体需要参考芯片手册                               void select_chip(void){                NFCONT  &= (~(1<<1)) ;                   int i;                for(i=10;i>0;i--);        }        void deselect_chip(void){                NFCONT |= (1<<1);                int i;                for(i=10;i>0;i--);        }                 void write_command(unsigned char command){                NFCMMD = command;                int i;                for(i=10;i>0;i--);        }                 /*               这款nand flash 的页大小是 2K               五个地址周期  (2个列地址 和3和行地址(页地址))        */        void write_address(unsigned int address){                unsigned int page = address/2048;                unsigned int col  = address&2048;                         int i;                NFADDR = col & 0xff;                for(i=5;i>0;i--);                NFADDR = (col >>8) & 0x0f;                for(i=5;i>0;i--);                NFADDR = page & 0xff;                for(i=5;i>0;i--);                NFADDR = (page >>8)& 0xff;                for(i=5;i>0;i--);                NFADDR = (page >>16)&0x01;                for(i=5;i>0;i--);        }                 unsigned char read_one_data(void){                return NFDATA;                int i;                for(i=10;i>0;i--);        }                 void wait_ready(void){                while(!(NFSTAT & 1));                int i;                for(i=10;i>0;i--);        }                          static void nand_reset(void){                select_chip();                write_command(0xff);                wait_ready();                deselect_chip();        }        void nand_init(void){                NFCONF =0;                NFCONT = (1<<4) | (1<<1) | (1<<0);                         nand_reset();        }                 /*        nand flash 的读操作是以页为单位的。         des: nand flash中读出的数据放到哪         start_addr: 从哪里开始读         size: 读多大        */        void nand_read(unsigned char *des,unsigned int start_addr,unsigned int size){                unsigned int col  = start_addr & 2048;                         select_chip();                unsigned int start = start_addr;                unsigned int end   = start_addr + size;                while(start < end){                             //每读一页需要发一次命令                        write_command(0x00);                        write_address(start);                        write_command(0x30);                        wait_ready();                                 while((col<2048) && (start<end)){ 在一页中读,我用的型号一页大小为2k[="" font][="" color][="" p][p="26," null,="" left]="" *des="read_one_data();[p=26," des++;[="" col++;[="" start++;[="" }[="" col="0; [p=26," deselect_chip();[="" p]

最近访客

< 1/3 >

统计信息

已有76人来访过

  • 芯币:1319
  • 好友:1
  • 主题:443
  • 回复:25
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言