本帖最后由 peter_wjp 于 2014-7-22 08:49 编辑
目前我在做一个通过SPI总线读取EEPROM的程序,使用的是STC15单片机,标准的SPI接口 非软件模拟。
但是由于需要读取的EEPROM是在别的PCB上已经焊接好的,所以 我通过一个SOP8的测试夹来进行连接。在软件调试中遇到了很多问题。
1. 如果我使用一个按键来触发读取操作,则单片机在连接PCB上电后,读取的内容一直为0,后来经过研究我发现PCB上的EEPROM的电源与PCB其他芯片的电源共通的,也就是说 存在其他芯片干扰数据读取。(后来通过示波器发现,需要读取的PCB板上的ARM芯片会在上电300ms以后将EEPROM的MISO拉低 内部估计是开漏状态,用万用表测量下是直接接地了)。
2. 基于第一点,我为了验证,就在程序里设置为上电初始化的时候执行一次读取(上电300ms以内),此时的数据就对了。 但是设计功能时候就要求必须用一个按键触发读取指令,我也想过讨巧的办法,就是在上电后读取一次,把数据暂存起来,按键触发时候直接就把数据显示出来就行了。但是因为还有其他功能,所以在初始化时候执行读取,会影响其他功能。
3. 然后我就想到,用三极管做为开关,在按键触发后,导通EEPROM的电源,然后读取完毕 就关断。使用的NPN管子(手头上有现成的) E极直接接地,+5V和C之间接需要读取的芯片,同时为了验证 我还并了一个发光二极管(包含限流电阻)来做为状态指示。然后通过单片机引脚来驱动三极管 (单片机口有上拉10K电阻)。在没有连接芯片时候,通过LED状态能够看到三极管能够可靠打开与关断,但是连接了EEPROM后,上电初始化没问题,三极管打开一次,之后当单片机输出为0时候,LED依然有微弱的亮光,可以判定三极管并没有可靠关断。
求原因,我下一步准备在单片机输出口和三极管B极加一个二极管。
--------------
7月22日更新
今天回去在三极管基极增加了二极管和电阻,情况依旧,后来分析程序,基本上找到答案了。
我对EEPROM进行读取时候使用的是mode 0的SPI协议,读取完毕后 SCK引脚会持续输出低电平,对于单片机来说,输出低电平相当于端口内部三极管开漏状态,相当于内部接地。因为所有的元件都是公用5V电源,所以才存在三极管即便关闭了,但是由于SCK拉低,相当于CE短接了。
我如果把SPI初始化放在程序运行最开始阶段,果然 监控状态的LED在上电后就开始亮了。基本验证了这个事实,我把SCK线移除,LED马上灭了。
|