我用的CH375串口方式,mega128,修改了读写函数,是否正确,CH375不能工作,测试命令也做不了。

这是我修改的函数,是否有问题? void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { /* 等待发送缓冲器为空*/ while ( !( UCSR1A & (1</* 将第9 位置1*/ UCSR1B |= 0x01; /* 将数据放入缓冲器,发送数据*/ UDR1 = mCmd; }

void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { /* 等待发送缓冲器为空*/ while ( !( UCSR1A & (1< /* 将第9 位置0*/ UCSR1B |= 0x00; /* 将数据放入缓冲器,发送数据*/ UDR1 = mData; }

UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { unsigned char status, resh, resl; /* 等待接收数据*/ while ( !(UCSR1A & (1< /* 从缓冲器中获得状态、第9 位及数据*/ status = UCSR1A; resh = UCSR1B; resl = UDR1; /* 如果出错,返回-1 */ if ( status & (1<return -1; /* 过滤第9 位数据,然后返回*/ resh = (resh >> 1) & 0x01; return ((resh << 8) | resl); }

#define FILE_DATA_BUF_LEN 0x0200 /*外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */ 这个是不是也应该注释掉,可是会导致后面的程序错误。


1. 写命令和数据之间加点延时。 2. 第9为置0 写法不对 3. 读的时候直接将返回8为数据既可。 void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { /* 等待发送缓冲器为空*/ while ( !( UCSR1A & (1</* 将第9 位置1*/ UCSR1B |= 0x01; /* 将数据放入缓冲器,发送数据*/ UDR1 = mCmd;

mdelayus(2); }

void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { /* 等待发送缓冲器为空*/ while ( !( UCSR1A & (1< /* 将第9 位置0*/ UCSR1B &= 0xfe; /* 将数据放入缓冲器,发送数据*/ UDR1 = mData; mdelayus(1); }

UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { unsigned char status, resh, resl; /* 等待接收数据*/ while ( !(UCSR1A & (1< /* 从缓冲器中获得状态、第9 位及数据*/ status = UCSR1A; resh = UCSR1B; resl = UDR1; /* 如果出错,返回-1 */ if ( status & (1<return -1; return resl; }


依然无果,什么都不返回,还是到了mStopIfError( i );一直闪,CH375不能初始化 测量26脚电压为5V,25脚电压为0V没问题 我的硬件连接是 ch375 mega128 rxd txd txd rxd int PD0 程序是: #include #include #include

/* 以下定义的详细说明请看CH375HF9.H文件 */ #define LIB_CFG_FILE_IO 1 /* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */

/* 单片机的RAM有限,其中CH375子程序用512字节,剩余RAM部分可以用于文件读写缓冲 */ #define DISK_BASE_BUF_LEN 2048 /* 默认的磁盘数据缓冲区大小为512字节,建议选择为2048甚至4096以支持某些大扇区的U盘,为0则禁止在.H文件中定义缓冲区并由应用程序在pDISK_BASE_BUF中指定 */ #define FILE_DATA_BUF_LEN 0x0200 /*外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */ /* 如果准备使用双缓冲区交替读写,那么不要定义FILE_DATA_BUF_LEN,而是在参数中指定缓冲区起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */

#define CH375_INT_WIRE ( PIND & 0x01 ) /* PIND.0, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */

#define NO_DEFAULT_CH375_F_ENUM 1 /* 未调用CH375FileEnumer程序故禁止以节约代码 */ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未调用CH375FileQuery程序故禁止以节约代码 */

#define FOSC 8000000 #define BAUD 9600

#include "CH375HFB.H"

void mDelay1uS( ) /* 至少延时1uS,根据单片机主频调整 */ { UINT8 i; for ( i = 5; i != 0; i -- ); }

void USART1_Init(void )/*串口1初始化*/ { UBRR1H = (FOSC/BAUD/16-1)/256;/* 设置波特率*/ UBRR1L = (FOSC/BAUD/16-1)%256; UCSR1B = (1<UCSR1C = (1<}

void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { /* 等待发送缓冲器为空*/ while ( !( UCSR1A & (1< /* 将第9 位复制到TXB8 */ //UCSR1B &= ~(1< //if ( mCmd & 0x0100 ) //UCSR1B |= (1< UCSR1B |= 0x01; /* 将数据放入缓冲器,发送数据*/ UDR1 = mCmd; mDelaymS(5); }

void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { /* 等待发送缓冲器为空*/ while ( !( UCSR1A & (1< /* 将第9 位复制到TXB8 */ //UCSR1B &= ~(1< //if ( mData & 0x0100 ) //UCSR1B |= (1< UCSR1B &= 0xfe; /* 将数据放入缓冲器,发送数据*/ UDR1 = mData; mDelaymS(5); }

UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ { unsigned char status, resh, resl; /* 等待接收数据*/ while ( !(UCSR1A & (1< /* 从缓冲器中获得状态、第9 位及数据*/ status = UCSR1A; resh = UCSR1B; resl = UDR1; /* 如果出错,返回-1 */ if ( status & (1< return -1; return resl; mDelaymS(5); }

/* 在PB4连接一个LED用于监控演示程序的进度,低电平LED亮 */ #define LED_OUT_INIT( ) { PORTB |= 0x00; DDRB |= 0x10; } /* PORTB.7 低电平为输出方向 */ #define LED_OUT_ACT( ) { PORTB |= 0x10; } /* PORTB.7 高电平驱动LED显示 */ #define LED_OUT_INACT( ) { PORTB &= 0x00; } /* PORTB.7 高电平驱动LED显示 */

/* 延时指定毫秒时间,根据单片机主频调整,不精确 */ void mDelaymS( UINT8 ms ) { UINT16 i; while ( ms -- ) for ( i = 5800; i != 0; i -- );

}

/* 检查操作状态,如果错误则显示错误代码并停机 */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 显示错误 */ while ( 1 ) { LED_OUT_ACT( ); /* LED闪烁 */ mDelaymS( 100 ); LED_OUT_INACT( ); mDelaymS( 100 ); } }

/* 为printf和getkey输入输出初始化串口 */ extern int _textmode; void mInitSTDIO( ) { UBRR0H = (FOSC/BAUD/16-1)/256;/* 设置波特率*/ UBRR0L = (FOSC/BAUD/16-1)%256; UCSR0B = 0x18; /* BIT(RXEN) | BIT(TXEN); */ UCSR0C = 0x06; /* BIT(UCSZ1) | BIT(UCSZ0); */ _textmode = 1; }

void USART_Transmit( unsigned char data ) {

while ( !( UCSR0A & (1<;

UDR0 = data; }

void Test_CH375(void)

{ UINT8 tmpx; xWriteCH375Cmd(0x06); xWriteCH375Data(0x55); tmpx=xReadCH375Data(); USART_Transmit(tmpx); }

void main( ) { UINT8 i, c, SecCount; UINT16 NewSize, count; /* 因为RAM容量有限,所以NewSize限制为16位,实际上如果文件较大,应该分几次读写并且将NewSize改为UINT32以便累计 */ UINT8 *pCodeStr; // CH375_PORT_INIT( ); LED_OUT_INIT( ); LED_OUT_ACT( );/* 开机后LED亮一下以示工作 */ mDelaymS( 2000 ); /* 延时2000毫秒 */ LED_OUT_INACT( ); USART1_Init(); mInitSTDIO( ); /* 为了让计算机通过串口监控演示过程 */ printf( "Start\n" ); Test_CH375(); #if DISK_BASE_BUF_LEN == 0 pDISK_BASE_BUF = &my_buffer[0]; /* 不在.H文件中定义CH375的专用缓冲区,而是用缓冲区指针指向其它应用程序的缓冲区便于合用以节约RAM */ #endif i = CH375LibInit( ); /* 初始化CH375程序库和CH375芯片,操作成功返回0 */ mStopIfError( i ); (后面都没动)


如果是这样的话,看下你的串口波特率设置是否有问题。


用示波器看看单片机发出的串口数据是否正确


我看有#define FILE_DATA_BUF_LEN 0x0200 /*外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */这条语句,用到了外部RAM,我一开始注释掉了,编译后发现后面的程序需要调用它,可是我用的串口方式中间并没有连外RAM,这个是不是有问题?


波特率没问题啊,单片机8M的晶振,9600的波特率?CH375的INT和TXD也没有4mA电流输出


能不能发一个调试好的128串口程序给我试试,个人信息保护,已隐藏


#define FILE_DATA_BUF_LEN 0x0200 定义了不会影响程序,只要单片机的RAM空间足够用


单片机不能TXD不能发出数据,始终保持高电平


你先把TXD的问题解决了吧。


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