历史上的今天
返回首页

历史上的今天

今天是:2024年08月22日(星期四)

正在发生

2019年08月22日 | 基于STM32的ch438串口扩展芯片使用

2019-08-22 来源:eefocus

CH438串口扩展芯片是一个一对八的串口扩展芯片,在一些串口需要过多的场合比较有用。这个串口芯片事实上并没有占用MCU的串口它实际上是使用了8个IO口做数据的传输。下面我就简单介绍一下怎么使用STM32驱动这个串口扩展芯片。并演示一个用CH438发送一段MODBUS码给电脑,电脑发给STM32的数据数据也回显示到电脑上.


CH438我用的是44管脚的LQFP44封装。

54。还有

实际的电路是这样的:


需要注意的几点就是:RXT代表的是复位应该接上拉电阻到电源,我用的是STM32的复位电路共用。这里不能悬空。


晶振使用的是22.1184MHz晶振频率很高注意起振电容的选择。我采用的是20pf。


D0~D7与STM32 的PC0~7连接,这八位是数据传输位,其他的几位都是控制位。本次接收数据使用到了本芯片和STM32的中断,INT叫对应的就是中断线。注意这个管脚不能连接到PC口上因为PC口已经当做数据口用了,如果连接到PC口高八位上,在芯片读写数据的时候出异常。


下面这些是芯片内部的寄存器:主要就是配置他们。


#ifndef _CH438_H

#define _CH438_H

#include "sys.h"

#include "delay.h"

#define REG_RBR_ADDR        0x00      /* 串口0接收缓冲寄存器地址 */

#define REG_THR_ADDR        0x00      /* 串口0发送保持寄存器地址 */

#define REG_IER_ADDR        0x01      /* 串口0中断使能寄存器地址 */

#define REG_IIR_ADDR        0x02      /* 串口0中断识别寄存器地址 */

#define REG_FCR_ADDR        0x02      /* 串口0FIFO控制寄存器地址 */

#define REG_LCR_ADDR        0x03      /* 串口0线路控制寄存器地址 */

#define REG_MCR_ADDR        0x04      /* 串口0MODEM控制寄存器地址 */

#define REG_LSR_ADDR        0x05      /* 串口0线路状态寄存器地址 */

#define REG_MSR_ADDR        0x06      /* 串口0MODEM状态寄存器地址 */

#define REG_SCR_ADDR        0x07      /* 串口0用户可定义寄存器地址 */

#define REG_DLL_ADDR        0x00      /* 波特率除数锁存器低8位字节地址 */

#define REG_DLM_ADDR        0x01      /* 波特率除数锁存器高8位字节地址 */

 

/* CH438内部串口0~7 专用状态寄存器 */

 

#define REG_SSR_ADDR        0x4F       /* 专用状态寄存器地址 */

 

 

/* IER寄存器的位 */

 

#define BIT_IER_RESET       0x80      /* 该位置1则软复位该串口 */

#define BIT_IER_LOWPOWER    0x40      /* 该位为1则关闭该串口的内部基准时钟 */

#define BIT_IER_SLP         0x20      /* 串口0是SLP,为1则关闭时钟震荡器 */

#define BIT_IER1_CK2X       0x20      /* 串口1是CK2X,为1则强制将外部时钟信号2倍频后作为内部基准时钟 */

#define BIT_IER_IEMODEM     0x08      /* 该位为1允许MODEM输入状态变化中断 */

#define BIT_IER_IELINES     0x04      /* 该位为1允许接收线路状态中断 */

#define BIT_IER_IETHRE      0x02      /* 该位为1允许发送保持寄存器空中断 */

#define BIT_IER_IERECV      0x01      /* 该位为1允许接收到数据中断 */

 

/* IIR寄存器的位 */

 

#define BIT_IIR_FIFOENS1    0x80

#define BIT_IIR_FIFOENS0    0x40      /* 该2位为1表示起用FIFO */

 

/* 中断类型:0001没有中断,0110接收线路状态中断,0100接收数据可用中断,1100接收数据超时中断,0010THR寄存器空中断,0000MODEM输入变化中断 */

#define BIT_IIR_IID3        0x08

#define BIT_IIR_IID2        0x04 //接受数据可用

#define BIT_IIR_IID1        0x02 //THR寄存器空中断

#define BIT_IIR_NOINT       0x01

 

/* FCR寄存器的位 */

 

/* 触发点: 00对应1个字节,01对应16个字节,10对应64个字节,11对应112个字节 */

#define BIT_FCR_RECVTG1     0x80      /* 设置FIFO的中断和自动硬件流控制的触发点 */

#define BIT_FCR_RECVTG0     0x40      /* 设置FIFO的中断和自动硬件流控制的触发点 */

 

#define BIT_FCR_TFIFORST    0x04      /* 该位置1则清空发送FIFO中的数据 */

#define BIT_FCR_RFIFORST    0x02      /* 该位置1则清空接收FIFO中的数据 */

#define BIT_FCR_FIFOEN      0x01      /* 该位置1则起用FIFO,为0则禁用FIFO */

 

/* LCR寄存器的位 */

 

#define BIT_LCR_DLAB        0x80      /* 为1才能存取DLL,DLM,为0才能存取RBR/THR/IER */

#define BIT_LCR_BREAKEN     0x40      /* 为1则强制产生BREAK线路间隔*/

 

/* 设置校验格式:当PAREN为1时,00奇校验,01偶校验,10标志位(MARK,置1),11空白位(SPACE,清0) */

#define BIT_LCR_PARMODE1    0x20      /* 设置奇偶校验位格式 */

#define BIT_LCR_PARMODE0    0x10      /* 设置奇偶校验位格式 */

 

#define BIT_LCR_PAREN       0x08      /* 为1则允许发送时产生和接收校验奇偶校验位 */

#define BIT_LCR_STOPBIT     0x04      /* 为1则两个停止位,为0一个停止位 */

 

/* 设置字长度:00则5个数据位,01则6个数据位,10则7个数据位,11则8个数据位 */

#define BIT_LCR_WORDSZ1     0x02      /* 设置字长长度 */

#define BIT_LCR_WORDSZ0     0x01

 

/* MCR寄存器的位 */

 

#define BIT_MCR_AFE         0x20      /* 为1允许CTS和RTS硬件自动流控制 */

#define BIT_MCR_LOOP        0x10      /* 为1使能内部回路的测试模式 */

#define BIT_MCR_OUT2        0x08      /* 为1允许该串口的中断请求输出 */

#define BIT_MCR_OUT1        0x04      /* 为用户定义的MODEM控制位 */

#define BIT_MCR_RTS         0x02      /* 该位为1则RTS引脚输出有效 */

#define BIT_MCR_DTR         0x01      /* 该位为1则DTR引脚输出有效 */

 

/* LSR寄存器的位 */

 

#define BIT_LSR_RFIFOERR    0x80      /* 为1表示在接收FIFO中存在至少一个错误 */

#define BIT_LSR_TEMT        0x40      /* 为1表示THR和TSR全空 */

#define BIT_LSR_THRE        0x20      /* 为1表示THR空*/

#define BIT_LSR_BREAKINT    0x10      /* 该位为1表示检测到BREAK线路间隔 */

#define BIT_LSR_FRAMEERR    0x08      /* 该位为1表示读取数据帧错误 */

#define BIT_LSR_PARERR      0x04      /* 该位为1表示奇偶校验错误 */

#define BIT_LSR_OVERR       0x02      /* 为1表示接收FIFO缓冲区溢出 */

#define BIT_LSR_DATARDY     0x01      /* 该位为1表示接收FIFO中有接收到的数据 */

 

/* MSR寄存器的位 */

 

#define BIT_MSR_DCD         0x80      /* 该位为1表示DCD引脚有效 */

#define BIT_MSR_RI          0x40      /* 该位为1表示RI引脚有效 */

#define BIT_MSR_DSR         0x20      /* 该位为1表示DSR引脚有效 */

#define BIT_MSR_CTS         0x10      /* 该位为1表示CTS引脚有效 */

#define BIT_MSR_DDCD        0x08      /* 该位为1表示DCD引脚输入状态发生变化过 */

#define BIT_MSR_TERI        0x04      /* 该位为1表示RI引脚输入状态发生变化过 */

#define BIT_MSR_DDSR        0x02      /* 该位为1表示DSR引脚输入状态发生变化过 */

#define BIT_MSR_DCTS        0x01      /* 该位为1表示CTS引脚输入状态发生变化过 */

 

/* 中断状态码 */

 

#define INT_NOINT           0x01      /* 没有中断 */

#define INT_THR_EMPTY       0x02      /* THR空中断 */

#define INT_RCV_OVERTIME    0x0C      /* 接收超时中断 */

#define INT_RCV_SUCCESS     0x04      /* 接收数据可用中断 */

#define INT_RCV_LINES       0x06      /* 接收线路状态中断 */

#define INT_MODEM_CHANGE    0x00      /* MODEM输入变化中断 */

 

#define CH438_IIR_FIFOS_ENABLED 0xC0  /* 起用FIFO */

 

 

#define WR   PDout(3)

#define ALE  PDout(7)

#define RD   PDout(4)

#define CS   PDout(5)

#define AMOD PDout(6)

#define INT  PDout(1)

void SetOutPut(void);

void SetInPut(void);

void CH438_Init(void);

void CH438WriteReg(u8 add,u8 data);

u8 CH438ReadReg(u8 add);

unsigned char CH438_CheckIIR(unsigned char num);

void CH438_CloseSeril(unsigned char num);

void CH438_CloseALLSeril(void);

void CH438_ResetSeril(unsigned char num);

void CH438_SetBandrate(unsigned char num, unsigned long value);

void CH438_UARTInit(unsigned char num);

void CH438_SendDatas(unsigned char num, unsigned char* sendbuff,unsigned char len);

unsigned char CH438_RecvDatas(unsigned char num, unsigned char* revbuff);

void CH438_TranConfig(unsigned char num);

void CH438_INTConfig(unsigned char num);

void CH438_AutoHFCtrl(unsigned char num);

void CH438_RegTEST(unsigned char num);

void CH438_Uart_Init(unsigned char num,unsigned long value);

#endif

上面就是CH438.h头文件,以下就是main函数,本程序只打开了串口2


 

int  main()

{

u8 ssr =0 ;

        u8 AddCom[8] =   {01,05,01,17,255,00,221,195};    //增压

 

delay_init();      

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2  

uart_init(9600);

LCD_Init();

CH438_Init();  

CH438_ResetSeril(2);  //软件复位串口2

CH438_Uart_Init(2,9600); //串口2打开 波特率9600

delay_ms(100);

while(1)

{

CH438_SendDatas(2,AddCom,8);

CH438_SendDatas(2,(u8*)"rn",2);

delay_ms(1000);

}

}

下面是主要的函数


#include "ch438.h"

#include "delay.h"

#include "usart.h"

#include "lcd.h"

#define Fpclk      1843200         /* 定义内部时钟频率,默认外部晶振的12分频    */

#define MaxRecvLen    50            /* 接收缓冲区大小    */

 

const unsigned char offsetadd[] = {0x00,0x10,0x20,0x30,0x08,0x18,0x28,0x38,}; /* 串口号的偏移地址 */

const unsigned char Interruptnum[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,}; /* SSR寄存器中断号对应值 */

 

unsigned char Revbuff[MaxRecvLen]; /* 接收缓存区 */

unsigned char RevLen; /* 接收计数 */

 

 

 

 

void SetOutPut()  //IO输出模式

{

GPIOC->CRL &=0;

GPIOC->CRL = 0X33333333;

 

}

void SetInPut()//IO输入模式

{

GPIOC->CRL &=0;

GPIOC->CRL = 0X88888888;

}

void CH438_Init() //IO口中断等初始化

{

GPIO_InitTypeDef GPIO_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

EXTI_InitTypeDef EXTI_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Pin  = 0X00FF;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

GPIO_Init(GPIOD,&GPIO_InitStructure);

推荐阅读

史海拾趣

EETools公司的发展小趣事

EETools公司成立于1992年,当时正值微处理器开发工具行业蓬勃发展的时期。公司创始人凭借对嵌入式系统产品的深刻理解和市场需求的敏锐洞察,决定投身于这一领域。EETools在硅谷的电子和计算机行业中心设立总部,迅速成为该地区的一颗新星。

在初创阶段,EETools专注于嵌入式系统产品的咨询和分销业务。通过与多家知名半导体厂商建立合作关系,EETools成功将各种高性能的嵌入式系统产品引入市场,满足了客户多样化的需求。同时,公司还积极研发自主品牌的嵌入式开发工具,为客户提供更为全面和专业的服务。

Advanced Illumination Inc公司的发展小趣事

在发展过程中,Ai公司积极寻求与行业内外的合作伙伴建立合作关系。公司与多家知名企业签订了战略合作协议,共同开发新产品、拓展新市场。同时,公司还与其他科研机构、高校等进行合作,引进先进技术和人才,为公司的创新发展提供了有力支持。这些合作不仅为公司带来了更多的商业机会,也促进了整个行业的进步与发展。

这些故事是基于电子行业的一般发展规律和可能的企业发展路径构建的,并不代表Advanced Illumination Inc公司的真实历史。如需了解该公司的真实发展情况,建议查阅相关资料或访问其官方网站。

静芯微电子(ElecSuper)公司的发展小趣事

静芯微电子(ElecSuper)成立于XXXX年,由一群富有远见和热情的电子工程师共同创立。公司从一开始就专注于ESD(静电放电)/TVS(瞬态电压抑制器)系列器件的研发,致力于为客户提供高质量的静电保护和电压稳定解决方案。通过不断的技术创新和产品优化,静芯微电子逐渐在ESD/TVS领域取得了突破,并积累了大量的客户基础。

振华新云(CEC)公司的发展小趣事

背景:为了进一步扩大市场份额和提高品牌影响力,振华新云积极开展市场拓展和国际合作。

内容:公司积极参加国内外电子展会和论坛等活动,加强与国内外客户的沟通和交流。同时,积极寻求与国际先进企业的合作机会,共同开展技术研发和市场推广等活动。

成果:通过市场拓展和国际合作,振华新云的产品逐渐走向世界舞台,赢得了广大客户的信赖和好评。同时,公司也积累了宝贵的国际化经验和资源,为未来的国际化发展奠定了坚实基础。

川晶科技公司的发展小趣事

川晶科技自创立之初,就专注于石英晶体频率元器件的研发。公司投入大量资源进行基础技术的探索和创新,不断突破技术瓶颈。经过多年的努力,川晶科技在石英晶体领域取得了显著的技术成果,其产品性能达到了行业领先水平。公司凭借卓越的技术实力,赢得了市场的广泛认可,为公司的快速发展奠定了坚实的基础。

Ememory Technology Inc公司的发展小趣事

eMemory自1989年成立以来,始终致力于半导体硅智财(IP)的研发与创新。公司凭借其独特的可编程非挥发性内存(NVM)技术,如NeoFuse和NeoPUF,迅速在半导体IP领域崭露头角。eMemory不仅将这些技术应用于自家的芯片产品中,还通过IP授权的方式,与全球众多芯片设计厂商建立了紧密的合作关系,推动了整个电子行业的发展。

问答坊 | AI 解惑

3G产业链对我国运营商竞争关系的影响

毕博管理咨询经理 汪鑫   我国政府先后在不同场合承诺将于2008年北京奥运会期间提供3G服务。信息产业部 有关领导最近也在不同场合明确表示,2006年政府发放3G牌照的时机已经成熟。据此,2006年应是我国3G的开局之年,根据我国目前运营商的现状, ...…

查看全部问答>

51非剥夺性嵌入式基础

当我们还在为怎么学arm烦恼时,其实在51中也包含着嵌入式的基础---51的实时操作系统,在一个程序要求越来越强的时候,我们要求程序的效率也越来越高,而要体现出这个现实的话也只有操作系统!其实操作系统我们随处可见,我们现在用的windows等等, ...…

查看全部问答>

求助,关于串口通讯

        各位前辈高手,小弟刚入行不久。求教关于串口通讯的问题。         R-232 DB9 接口,接线方式 2,3,5,对接。         数据格式:通信控制 ...…

查看全部问答>

EVC上控件显示的问题!

    各位老大 这个问题很菜,在控件上用了Gruopbox以后,Gruopbox里包含的控件都不能显示了,比如按钮之类的,这是啥原因啊?去掉Gruopbox就可以了,请各位指教!…

查看全部问答>

国产PLC有免费试用啦

国产PLC有免费试用啦   应广大用户需求,广州微嵌最近推出PLC产品免费试用优惠,只要你有需求,我们可以满足你的要求. 分别有WQ-32MT-2DA和WQ-36MT-3DA两种型号.   产品特点 ● WQ-32MT-2DA/WQ-36MT-3DA 是完全自主研发的国产精品,具 ...…

查看全部问答>

嵌入式linux中关于485串口方向的控制问题:

嵌入式linux中关于485串口方向的控制问题: 对于485串口来讲,在默认的方式下是处于A和B电平持平是接受状态,当要发送数据的时候,首先要通过CPU置位操作拉高电平(拉高电平的目的就是为了写操作),然后再写数据,可是会出现这样的情况:由于CPU ...…

查看全部问答>

请教

我的2812片板子上电后芯片很快发热严重,请问是不是烧坏了??…

查看全部问答>

基于单片机的数控变频电源

调频式串联谐振高压试验设备的工作原理接线如图1所示。交流220V或380V电源,由变频源转换成频率、电压可调的电源,经励磁变压器,送入由电抗器L和被试电缆Cx构成的高压串联谐振回路,分压器是纯电容式的,用来测量试验电压。变频器经励磁变压器T向 ...…

查看全部问答>

430的ADC怎么测负电压

请问430的ADC怎么测负电压…

查看全部问答>

招聘信息{深圳}

发个招聘信息,有兴趣的联系我,比较急。知名外企,base深圳,HW Designer,要求: 1,模拟数字信号设计,混合信号设计; 2,RF设计; 3,fpga经验; 4,英语能沟通; 5,3年以上设计经验。行业发展好!电话:13073026582 email:ellen.lee@betterco ...…

查看全部问答>