我是用LPC2138与375相连的,写数据和命令均正常,但读取中断状态总是不正确,状态的最高位总是为高,比如测试命令时写入数据0XEE,返回0X91(应该为0X11).按照流程我将数据按扇区写入了U盘,说明写数据和命令是对的,没有将最高位和电源短接,读出的状态低7位都正确,请问这是什么原因,谢谢.
那肯定是你的位8有问题,至于什么问题,你可以先查下会不会你的硬件上面把位8接到VCC上面或者加了强上拉之类的,其次就去查下你的软件的配置,在读数据的时候是配置成输入状态吗?还有就是在我们芯片往最高位送低电平的时候,你拿示波器去看下是不是有低电平出来?
硬件有问题的话,写命令和数据的时候应该就不会成功了,软件的话也应该设置对了,因为就差这一位,其他几位都好的,会不会是芯片坏了.我在LPC2103上做是好的.同样的流程不同的芯片和处理器,结果就差读的时候错一位.
那么可以肯定软件上面没有任何问题,你可以按照我上面说的方法往位8上面送0,你看下可以不可以把数据送出去,或者你可以把芯片的位8撬起来看可以不可以拉低电平
贴片焊在板上了,现在也无法撬起来,在上面写0时可以置低的.下面是我的读写子程序:
void USB_WriteCommand(uint8 command) {
mDelay1_2uS( );mDelay1_2uS( ); IO0DIR|=0x00040020; IO0CLR|=OE; IO0SET|=DIR; //设置245为输出 IO1CLR|=0x03fc0000; //清并口输出 IO0SET|=USB_A0; IO1SET|=((uint32)command<<18); IO1DIR|=0x03fc0000;//并口设置为输出 IO1DIR|=0x00030000;//RD,WR输出 IO0DIR|=0x02420010;//控制口为输出 IO0SET|=ADR2|USB_A0; IO0CLR|=G139|ADR1; IO1SET|=RD; IO1CLR|=WE; //以上写有效 mDelay1_2uS( );mDelay1_2uS( ); IO0SET|=G139|ADR1|USB_A0; IO1SET|=RD|WE; IO0CLR|=USB_A0; IO1DIR&=0xfc03ffff;//禁止输出 mDelay1_2uS( );mDelay1_2uS( ); }
void USB_WriteData(uint8 dat) {
mDelay1_2uS( );mDelay1_2uS( ); IO0DIR|=0x00040020; IO0CLR|=OE; IO0SET|=DIR; //设置245为输出 IO1CLR|=0x03fc0000; //清并口输出 IO0SET|=USB_A0; IO1SET|=((uint32)command<<18); IO1DIR|=0x03fc0000;//并口设置为输出 IO1DIR|=0x00030000;//RD,WR输出 IO0DIR|=0x02420010;//控制口为输出 IO0SET|=ADR2|USB_A0; IO0CLR|=G139|ADR1; IO1SET|=RD; IO1CLR|=WE; //以上写有效 mDelay1_2uS( );mDelay1_2uS( ); IO0SET|=G139|ADR1|USB_A0; IO1SET|=RD|WE; IO0CLR|=USB_A0; IO1DIR&=0xfc03ffff;//禁止输出 mDelay1_2uS( );mDelay1_2uS( ); }
uint8 USB_ReadData() { extern uint8 dat; mDelay1_2uS( );mDelay1_2uS( ); IO0DIR|=0x00040020; IO0CLR|= OE|DIR; //设置245 IO1DIR&=0xfc03ffff;//并口设置为输入 IO1DIR|=0x00030000;//RD,WR输出 IO0DIR|=0x02420010;//控制口为输出 IO0SET|=ADR2; IO0CLR|=ADR1|G139;//|USB_A0; IO0SET|=USB_A0; IO1SET|=WE; IO1CLR|=RD; mDelay1_2uS( );mDelay1_2uS( ); dat=IO1PIN>>18; IO0SET|=G139|ADR1;//输出无效信号 //IO0CLR|=USB_A0; IO1SET|=RD|WE; IO0SET |=OE; return (dat); }
我找到原因了 模板不一样缘故,Thumb2138是可以的 但是ARM2138模板就不可以 不知道为什么