LPC2148 I/O口读写模块,用过的给看一下,急
1、LPC2148频率48MHz,以扇区方式读写,读写数据基本函数如下,检测U盘、枚举文件、向U盘写数据,都是准确的,只有读操作出现错误;
2、模块直接插在主板上,示波器观察读写引脚控制信号都正确,电源线也比较粗了,应该没干扰的;
3、我按顺序写入2048个unsigned char类型数据(0到255循环多次),读出的数据中以64个字节为单位,有的正确,有的错误,也就是说,第一个64个字节出现错误,则可能是0x00 0x00 0x00 0x00 0x00 0x01 0x02 0x03 0x04 0x05 0x06……0x3a 0x3b,本来应该是0x00 0x01 0x02 ……0xfe 0xff; 接下来几个64个字节又是正确的,是0x40 0x41 0x42 ……0xfe 0xff,出现错误的64字节,总是先几个0x00,偶尔也出现0x01,然后又是从0x00开始的按顺序的数值。
4、void mDelay1_2uS( )对读影响很大,调节延时时间,会影响错误个数,总是调不好,按理说不需要这么严格。


void mDelay1_2uS( ) // 至少延时1.2uS,根据单片机主频调整
{
uint32 i;
for ( i = 20; i != 0; i -- ); // 本例由于模拟I/O较慢故只需少量延时
}
void CH375HM_INDEX_WR( unsigned char Index ) // 写索引地址
{
mDelay1_2uS( ); mDelay1_2uS( ); // 至少延时1uS
FIO1PIN2 = Index;
FIO0CLR = LCDA0;
FIO0CLR = UDCS;
FIO0CLR = WR; //约40ns时间
IO0DIR = IO0DIR; IO0DIR = IO0DIR; // 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS
FIO0SET = WR;
FIO0SET = UDCS;
FIO0SET = LCDA0|RD;

mDelay1_2uS( ); mDelay1_2uS( ); // 至少延时1uS
}
void CH375HM_DATA_WR( unsigned char mData ) // 写数据
{
mDelay1_2uS( ); mDelay1_2uS( ); // 至少延时1uS
FIO1PIN2 = mData;
FIO0SET = RD|LCDA0;
FIO0CLR = UDCS;
FIO0CLR = WR;
IO0DIR = IO0DIR; IO0DIR = IO0DIR; // 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS
FIO0SET = WR|UDCS|RD;
FIO0SET = LCDA0;
mDelay1_2uS( ); mDelay1_2uS( ); // 至少延时1uS
}
unsigned char CH375HM_DATA_RD( void ) // 读数据
{
unsigned char mData;

FIO1DIR = 0x00000000;

mDelay1_2uS( );

FIO0SET = LCDA0|WR;
FIO0CLR = UDCS;
FIO0CLR = RD;

IO0DIR = IO0DIR;
IO0DIR = IO0DIR; // 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS
mData = FIO1PIN2;
IO0DIR = IO0DIR;
IO0DIR = IO0DIR;
FIO0SET = RD;
FIO0SET = UDCS;

FIO1DIR = 0x03FF0000;
return( mData );
}
[Emot]27[/Emot][Emot]27[/Emot][Emot]27[/Emot][Emot]27[/Emot][Emot]27[/Emot]
找到原因了,问题解决,还是地线的问题,
我又加了根粗的电源线地线,效果好很多,基本上准确,
光着脚奔跑
只有登录才能回复,可以选择微信账号登录