我的372取反不过,返回的是0xff,程序和PCB如下,麻烦大家帮着看一下,谢谢!UploadImages/200772016135388.rar
返回0XFF的话,那么,一种情况就是晶振没起振,另外一种情况就是你上电之后没有给芯片50MS以上的延时
晶振的输入,输出脚都是12Mhz 我延时了,程序如下:
//********************************************************************************************************/ #include "config.h" #include ".\CAN\IncludeCAN.h" //for(i=0;i<=73;i++);//8us //for(i=0;i<=219;i++);//24us //-------------------------------------------------------------------------------- void USBWriteCMD(uint32 CMD) { int i; IO0DIR=0x0000ff72; // set data p0.8-15 ,wr,rd,a0 p0.1.4,5,6 as output IO0CLR=0x00000010;//a0=0 IO0SET=0x00000040; //wr=1 IO0SET=0x00000020; //rd=1 // CMD=CMD<<8; IO0PIN=CMD; IO0SET=0x00000010; //a0=1 IO0CLR=0x00000040; //wr=0 for(i=0;i<=73;i++); //8us IO0SET=0x00000040; //wr=1 for(i=0;i<=73;i++); //8us IO0CLR=0x00000010; //a0=0 IO0SET=0x00000040; //wr=1 IO0SET=0x00000020; //rd=1 } //--------------------------------------------------------------------- void USBWriteData(uint32 Data) { int i; IO0DIR=0x0000ff72; // set data p0.8-15 ,wr,rd,a0 p0.1.4,5,6 as output IO0CLR=0x00000010; //a0=0 IO0SET=0x00000040; //wr=1 IO0SET=0x00000020; //rd=1 IO0PIN=Data; IO0CLR=0x00000040; //wr=0 for(i=0;i<=73;i++); //8us IO0SET=0x00000040; //wr=1 for(i=0;i<=73;i++); //8us IO0SET=0x00000010; //a0=1 IO0SET=0x00000040; //wr=1 IO0SET=0x00000020; //rd=1 } //----------------------------------------- uint32 USBReadData( ) { int i; uint32 Data; IO0DIR=0x00000072; // set data p0.8-15 as input ,wr,rd,a0 p0.1.4,5,6 as output IO0CLR=0x00000010; //a0=0 IO0SET=0x00000040; //wr=1 IO0CLR=0x00000020; //rd=0 Data=IO0PIN; // Data=Data>>8; for(i=0;i<=73;i++); //8us IO0SET=0x00000020; //rd=1 return(Data); IO0SET=0x00000010; //a0=1 IO0SET=0x00000040; //wr=1 IO0SET=0x00000020; //rd=1 } //----------------------------------------- InitCH372() { int i; uint32 Data; USBWriteCMD(0x00000500); for(i=0;i<=400000;i++);//delay 40ms while(1) { USBWriteCMD(0x00000500); for(i=0;i<=400000;i++);//delay 40ms USBWriteCMD(0x00000600); USBWriteData(0x0000aa00); Data=USBReadData( );
Data=(Data>>8); Data=(Data&0x000000ff); if(Data==0x000000ff) break; }
USBWriteCMD(0x00001500);//set usb mode 2 USBWriteCMD(0x00000200); } //---------------------------------------- int main (void) { uint32 Data; for(i=0;i<=800000;i++);//delay 80ms
IO0DIR=0x0000ff72; // set data p0.8-15 ,wr,rd,a0 p0.1.4,5,6 as output
PINSEL0 = 0x0000c000; // 设置IO口工作模式,P0.7设置为EINT2 PINSEL1 = 0x00000000; IO0CLR=0x00000010; //a0=0 IO0SET=0x00000040; //wr=1 IO0SET=0x00000020; //rd=1 IO0SET=0x00000002; //cs=1 IO0CLR=0x00000002; //cs=0 InitCH372(); }
/********************************************************************************************************* ** End Of File ********************************************************************************************************/
那你这样,在你发送数据的时候,你这样写你的程序: USBWriteCMD(0x00000600); while(1){ USBWriteData(0x0000aa00); } 你看下这个时候发出去的数据是不是0XAA 当你确定数据发送出去之后,那么你在读的时候可以这样: USBWriteCMD(0x00000600); USBWriteData(0x0000aa00); while(1){ Data=USBReadData( ); } 看下你读到的数据到底是什么样的数据
感谢回复! USBWriteCMD(0x00000600); while(1){ USBWriteData(0x0000aa00); } 用示波器测得确实是0xaa USBWriteCMD(0x00000600); USBWriteData(0x0000aa00); while(1){ Data=USBReadData( ); } 372引脚上是0xff 如果可以,麻烦看下我的PCB,还有,请问cs一直接地有没有问题,谢谢!
3。3V工作的,你用的是什么型号的372芯片?
这是在LPC2114上的三个读写子函数,CH375与计算机通讯成功的.你可以参考下时序
/* LPC2114单片机的引脚 CH375芯片的引脚 P0.5 INT# P3.0 A0 P3.25 CS# P3.27 WR# P1.1 RD# P2.8-P2.0(8位端口) D7-D0 */
void mDelay1_2uS( ) /* 至少延时1.2uS,根据单片机主频调整 */ { UINT32 i; for ( i = 20; i != 0; i -- ); /* 本例由于模拟I/O较慢故只需少量延时 */ }
/* 基本操作 */ void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */ { IO3SET |= 0x0A000000; /* 设置CS,WR,RD默认为高电平 */ IO1SET |= 0x00000002; IO0DIR &= 0xFFFF00D0; /* 设置8位并口和INT#为输入 */ IO3DIR |= 0x0A000001; IO1DIR |= 0x00000002; /* 设置CS,WR,RD,A0为输出 */ }
void xWriteCH375Cmd( unsigned char cmd ) /* 向CH375的命令端口写入命令,周期不小于4uS,如果单片机较快则延时 */ { IO2CLR = 0x000000FF; /* 清并口输出 */ IO2SET |= cmd ; IO3SET |= 0x00000001; /* 向CH374的并口输出数据, 输出A0(P0.4)=1; */ IO1SET |= 0x00000002; /* 输出无效的控制信号, 完成操作CH374芯片, A0(P0.4)=1; CS(P0.7)=1; WR=(P0.6)=1; RD(P0.5)=1; */ IO1DIR |=0x00000002; IO2DIR |=0x000000FF; IO3DIR |= 0x0A000001; /* 写操作所以数据输出, 设置CS,WR,RD,A0为输出 */ IO3CLR = 0x0A000000; /* 输出有效写控制信号, 写CH374芯片的命令端口, A0(P0.4)=1; CS(P0.7)=0; WR=(P0.6)=0; RD(P0.5)=1; */ IO3DIR = IO3DIR; /* 该操作无意义,仅作延时,CH374要求读写脉冲宽度大于100nS */ IO3SET |=0x0A000000; IO3CLR = 0x00000001; /* 输出A0(P0.4)=0; 可选操作 */ IO2DIR &= 0xFFFFFF00; /* 禁止数据输出 */ }
void xWriteCH375Data( unsigned char dat ) /* 向CH375的数据端口写入数据,周期不小于1.5uS,如果单片机较快则延时 */ { IO2CLR = 0x000000FF; ; /* 清并口输出 */ IO2SET |= dat ; /* 向CH374的并口输出数据 */ IO2DIR |= 0x000000FF; /* 写操作所以数据输出 */ IO1SET |=0x00000002; IO3CLR = 0x00000001; /* 输出有效写控制信号, 写CH374芯片的数据端口, A0(P0.4)=0; CS(P0.7)=0; WR=(P0.6)=0; RD(P0.5)=1; */
IO3CLR = 0x0A000001; /* 输出有效写控制信号, 写CH374芯片的数据端口, A0(P0.4)=0; CS(P0.7)=0; WR=(P0.6)=0; RD(P0.5)=1; */ IO3DIR = IO3DIR; /* 该操作无意义,仅作延时,CH374要求读写脉冲宽度大于100nS */ IO3SET |= 0x0A000000; /* 输出无效的控制信号, 完成操作CH374芯片, A0(P0.4)=0; CS(P0.7)=1; WR=(P0.6)=1; RD(P0.5)=1; */ IO2DIR &= 0xFFFFFF00; /* 禁止数据输出 */ }
unsigned char xReadCH375Data( void ) /* 从CH375的数据端口读出数据,周期不小于1.5uS,如果单片机较快则延时 */ { UINT8 mData; IO2DIR &= 0xFFFFFF00; /* 读操作所以数据输入 */ IO3CLR = 0x00000001; IO3CLR = 0x02000001; /* 输出有效读控制信号, 读CH374芯片的数据端口, A0(P0.4)=0; CS(P0.7)=0; WR=(P0.6)=1; RD(P0.5)=0; */ IO1CLR =0x00000002; IO3DIR = IO3DIR; /* 该操作无意义,仅作延时,CH374要求读写脉冲宽度大于100nS */ mData = (UINT8)( IO2PIN &0xff); /* 从CH374的并口P0.15-P0.8输入数据 */ IO1SET |=0x00000002; /* 输出无效的控制信号, 完成操作CH374芯片, A0(P0.4)=0; CS(P0.7)=1; WR=(P0.6)=1; RD(P0.5)=1; */ IO3SET |= 0x0A000000; return( mData ); }
我用的372V 测了V3,VCC电压是3。3v的 程序我试一下看 谢谢!