关于ARM7和ch375串口通讯

arm7串口采用奇偶校验 强制为1或0的方式实现对应ch375的9位数据发送,可为什么ch375没反应呢(不回复)。我是这样做的程序: 请赐教问题出在哪 芯片复位正常 void USB_UART_INIT(void) { unsigned long Fdiv; //uart1 p2.0 p2.1 PINSEL4=(PINSEL4&0xffCffff0)|0x0000000A; //使用UTAR1功能 P2.10 U1LCR = 0xBB; //8数据位 一个停止位 奇偶校验位 校验位强制为1 Fdiv = ( Fpclk / 16 ) / UART1_BAUDRATE ; U1DLM = Fdiv / 256; U1DLL = Fdiv % 256; U1LCR = 0x2B; U1FCR = 0x07; }

void CH375_WR_CMD_PORT( unsigned char cmd ) { U1LCR = 0x2B; //(U1LCR&0x0F)|第9位强制为1 while (!(U1LSR & 0x20)); U1THR = cmd; } void CH375_WR_DAT_PORT( unsigned char dat ) { U1LCR = 0x3B; //(U1LCR&0x0F)|第9位强制为0 while (!(U1LSR & 0x20)); U1THR = dat; }

unsigned char CH375_RD_DAT_PORT(void) { char re_dat; while ((U1LSR & 0x01)==0); re_dat=U1RBR; // DEBUG("14!"); return re_dat; }

默认波特率是多少? 上电后先延时50MS,然后做测试命令。另外在读数据的时候,你把奇偶校验关闭。你看一下你的MCU资料,如果奇偶校验不对的话,MCU是否会置U1LSR的接受完成标志


楼上:芯片CH375B的默认波特率为9600bps,我按着你说的试了一次还是不行,不过我试着读了U1LSR,确实是校验不对,所以才导致U1LSR的接受完成标志不能置位,我用的是lpc2368


那你用示波器看一下,CH375是不是确实有数据返回。返回的数据是不是正确的。


解决了,用arm7和CH375串口连接经验如下: 1.采用命令强制校验位为1,数据强制校验位为0的方式 实现串口9位数据 2.接收时设置为奇数校验(我开始设置为无校验,接收不对;偶校验接收不到,当然示波器看有数据。) 以上两点介绍给用各位


2.接收时设置为奇数校验?? 这未必正确,奇偶校验是根据1个数来决定的。而CH375最后一位始终是0,奇数校验未必正确。做0X06命令测试,用不同的数测试,可能还会有问题


我测测


楼上,你好!设置为奇校验确实有问题,除了0x06测试可以外,其他的设置返回都不对,而且我用示波器观察和返回的数据是一样的,不知道你们有没有用arm 串口的demo程序啊 在线等!谢谢


这个数据你应该可以强制读出,你检测到校验错误的时候,就去读缓冲区里的数据。另外,这款ARM功能很强大,应该有九位数据格式,而不要用奇偶校验。


楼上:问题依然无法解决,现在用无校验方式接收,是0x06测试通过,不过设置模式返回是0XFF,arm7没有9位数据格式。请在分析一下什么原因,论坛好像不能发图啊,谢了 郁闷应


没有第9位 应该可以使用奇偶校验位来代替的。

void xWriteCH375Cmd( UINT8 mCmd) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */ { U1LCR = 0xAB; //8bit data,1bit stop,1bit 奇偶,强制为1 U1THR = mCmd; //允许串口发送中断 while((U1LSR & 0x20) == 0); delay_us( ); }

void xWriteCH375Data( UINT8 mData) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */ { U1LCR = 0xBB; //8bit data,1bit stop,1bit 奇偶,强制为0 U1THR = mData; //允许串口发送中断 while((U1LSR & 0x20) == 0); delay_us( ); }

UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */ {

UINT8 mData; // delay_us( ); while((U1LSR & 0X01)==0); //if((U1LSR & 0X01)==0) mData = U1RBR; delay_us( ); return( mData ); }


方法就是用奇偶校验位代替第九位,接收时用无校验位方式,并命令与数据发送和读写要有适当延时


枚举后读出数据 bLength=18 bDescriptorType=1 bcdUSB=272 bDeviceClass=1 bDeviceSubClass=4 bDeviceProtocol=16 bMaxPacketSize0=64 idVendor=47108 idProduct=21521 bcdDevice=16400 iManufacturer=0 iProduct=1 iSerialNumber=5 bNumConfigurations=36

其中bDeviceClass怎么会是1呢 请帮忙说明一下什么原因 谢谢


你操作的这个设备 是一个什么设备? 关于一些类的定义请参考USB规范


我操作的是打印机


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