[求助] 我无能为力了,求贵公司解答。。。。

hcn 你好。。。。我按照你提供的资料重新写了个简单的测试程序。。。我P1口是接了八个LED的。。。

调用命令0x06,写入数据0x55。。。然后读取376返回的数据。。。。如果数据为55的取反就证明376有正常工作,如果不是则证明376没有正常工作。。。。得到的数据依然是0x00。

以下是全部代码。。。。。现在的代码就简单多了

#include #include #include

sbit P32 = P3^2; sbit P33 = P3^3; sbit P34 = P3^4; sbit P35 = P3^5;

typedef signed char INT8; typedef signed int INT16; typedef signed long INT32;

typedef unsigned char UINT8; typedef unsigned int UINT16; typedef unsigned long UINT32;

#define SPI_SDO P32 //输出引脚 #define SPI_SDI P33 //输入引脚 #define SPI_SCS P34 //片选输入引脚 #define SPI_SCK P35 //输入时钟引脚

void Spi376OutByte(UINT8 d); //SPI输出8个位数据 UINT8 Spi376InByte(void); //SPI输入8个位数据 #define EndCH376Cmd(){SPI_SCS=1;} //SPI片选无效,结束通信 void WriteCH376Cmd(UINT8 mCmd); //向376写命令 void WriteCH376Data(UINTmData); //向376写数据 UINT8 ReadCH376Data(void); //从376读数据 void mDwlay0_5us(void); //延时子程序 void mDelayuS( UINT8 us );

main( ) { UINT8 a; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ; mDwlay0_5us() ;

WriteCH376Cmd(0x06); WriteCH376Data(0x55); a = ReadCH376Data(); if(a==0xaa) { P1=0xaa; } else { P1=a; } while ( 1 ) {

} }

void Spi376OutByte(UINT8 d) //SPI输出8个位数据 { UINT8 i; for(i=0;i<8;i++) { SPI_SCK=0; if(d&0x80)SPI_SDI=1; else SPI_SDI=0; d<<=1; SPI_SCK=1;/*上升沿采样输入*/ } }

UINT8 Spi376InByte(void) //SPI输入8个位数据 { UINT8 i,d; d=0; for(i=0;i<8;i++) { SPI_SCK=0;/*下降沿输出*/ d<<=1; if(SPI_SDO)d++; SPI_SCK=1; } return(d); }

void WriteCH376Cmd(UINT8 mCmd) //向376写命令 { SPI_SCS=1; mDwlay0_5us(); SPI_SCS=0; Spi376OutByte(mCmd); mDwlay0_5us();mDwlay0_5us();mDwlay0_5us(); }

void WriteCH376Data(UINT8 mData) //向376写数据 { Spi376OutByte(mData); }

UINT8 ReadCH376Data(void) //从376读数据 { return(Spi376InByte()); } void mDelayuS( UINT8 us ) { while ( us -- ); /* 24MHz MCS51 */ }

void mDwlay0_5us(void) { UINT8 i=80; while ( i -- ) { mDelayuS( 250 ); mDelayuS( 250 ); mDelayuS( 250 ); mDelayuS( 250 );

} }

返回的不是0x55的取反这说明,单片机与376 SPI通信没有成功。。。。 但我量了376的晶振两脚,每个脚对地都为2V左右,我是5V系统。。。应该晶振有起振。。。 但还是查不出问题出哪里/......


芯片的3,4脚接地,27脚接VCC接了没有?


3,4有接地。。。。 27脚就没有接VCC,可能是这个问题,我接一下试试看


201151910181278.jpg

201151910182561.jpg

201151910184678.jpg

2011519101923.jpg

chn 不好意思还是不行啊。。。。27脚接了VCC还是老样子。。。 会不会是我的引线太长?得接上拉电阻? 但我的引线也不算长啊才10CM 而已啊。。应该不是这个问题吧?


线长的话,建议你多连接几个地线。同时上电延时100MS之后读取00-1EH号寄存器,和芯片说明书默认的值是否一样。


这几天忙了别的事情了,,明天或者后天继续解决这个问题。。。。

好的,明天加多几条地线,然后再抓一下波形看看。。。。


hcn 你好,376初始化的问题已经解决了, 376已经证实能正常工作了。。。。发送命令0x06,发送数据0x55能正常取反。。。设置模式发送命令0x15,数据0x06 也能正常设置成U盘模式。。。这时U盘插入,板上的灯就亮,拔掉就熄灭。。。 201152321201476.jpg

然后第四步得怎么操作?数据手册里没有说得不是很清楚。。。。先发0x30的命令然后?“产生中断状态”是什么意思?发0x30的命令后,就接收0x15的状态吗?


下面你去下载CH376EVT.ZIP,里面有51的例子程序,按照那个程序就可以对U盘进行文件操作。


hcn 这个我知道啊,就是我用CH376EVT.ZIP的例程,添加一个TXT文件没有成功。。。。

所以我才想自己写。。


我司提供的例子程序都是可以操作的,不建议你自己写程序,你只需要跟踪下程序哪个步骤出现问题。然后我们在帮您解决问题。


我的P1是接了8个LED 上面有说过。。。。

程序就卡在初始化后,检测优盘是否插入,这里。。。无论我是否插入优盘,程序都只在while循环这里。。。。。

2011524135047.jpg


如果出现这个函数无法通过的话,那么检查下你的单片机和CH376的中断引脚连接是否正常。


单片机和376中断引脚? 不是用软件查询中断,可以不用接INT引脚吗? 中断引脚连接是否正常,那中断的引脚是376的那个脚,我用单片机的IO口去连接。。。。


只有登录才能回复,可以选择微信账号登录