CH438串口扩展芯片是一个一对八的串口扩展芯片,在一些串口需要过多的场合比较有用。这个串口芯片事实上并没有占用MCU的串口它实际上是使用了8个IO口做数据的传输。下面我就简单介绍一下怎么使用STM32驱动这个串口扩展芯片。并演示一个用CH438发送一段MODBUS码给电脑,电脑发给STM32的数据数据也回显示到电脑上.
CH438我用的是44管脚的LQFP44封装。
实际的电路是这样的:
需要注意的几点就是: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);
上一篇:基于STM32F103ZET6主控平台实现定时器TIM3的驱动
下一篇:STM32 测量交流电压的方法
推荐阅读
史海拾趣
在追求经济效益的同时,Able Systems公司也注重履行企业社会责任。公司积极参与公益事业,关注环境保护和可持续发展。通过采用环保材料、推广节能技术等措施,公司努力降低生产过程中的能耗和排放。同时,公司还关注员工福利和职业发展,为员工提供良好的工作环境和培训机会。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。
请注意,以上内容仅为概述性质,并非基于Able Systems公司的实际发展历程。如需了解更多关于Able Systems公司的故事,建议查阅相关新闻报道、公司年报等官方资料。
ALLTHREAD深知品牌建设的重要性。他们注重提升品牌形象和知名度,积极参加各类行业展会和论坛,与业界同仁交流学习。同时,他们还建立了完善的客户服务体系,为客户提供及时、专业的技术支持和售后服务。这些举措有效提升了ALLTHREAD的品牌影响力和客户满意度。
2022年7月22日,国博电子在上海证券交易所科创板成功上市,标志着公司进入了一个新的发展阶段。上市不仅为公司带来了更多的资金支持和市场关注,也为其未来的发展提供了更广阔的空间。作为中国电子科技集团有限公司(简称“中国电科”)的首家科创板上市公司,国博电子承载着推动中国电子信息产业高质量发展的重任。上市以来,公司继续加大研发投入,拓展产品线,致力于成为全球射频电子领域的行业领导者。
2022年7月22日,国博电子在上海证券交易所科创板成功上市,标志着公司进入了一个新的发展阶段。上市不仅为公司带来了更多的资金支持和市场关注,也为其未来的发展提供了更广阔的空间。作为中国电子科技集团有限公司(简称“中国电科”)的首家科创板上市公司,国博电子承载着推动中国电子信息产业高质量发展的重任。上市以来,公司继续加大研发投入,拓展产品线,致力于成为全球射频电子领域的行业领导者。
在电子行业竞争激烈的今天,COMPEX公司始终坚持质量至上的原则。公司建立了严格的质量管理体系,从原材料采购到产品生产、检验、出货等各个环节都严格把关,确保产品质量符合客户要求。这种对质量的执着追求,使得COMPEX的产品在市场上具有很高的口碑和竞争力。
近年来,ACAM公司开始将目光投向增材制造领域。ACAM公司与上海交通大学等高校建立了紧密的合作关系,共同推动增材制造技术的发展。通过合作研究,ACAM公司成功地将时间数字转换技术应用于增材制造领域,为行业的发展提供了新的动力。
《模拟电路基础》模拟试题 一 填空题(每题2分,共40分) 1 N沟道____________型的MOS管,其Vgs值可以为负也可以为正,而P沟道的JFET,其Vgs值只能是___________值。2 再三种组态中,__________组态的放大能力最强,__________组态的输入电阻最大,_ ...… 查看全部问答∨ |
FCS是由PLC发展而来的;而在另一些行业,FCS又是由DCS发展而来的,所以FCS与PLC及DCS之间有着千丝万缕的联系,又存在着本质的差异。本文试就PLC、DCS、FCS三大控制系统的特点和差异作一分析,指出它们之间的渊源及发展方向。 摘 要: ...… 查看全部问答∨ |
随着半导体制造商向65纳米技术转移并展望更小节点,严峻的测试挑战也开始浮出水面。现在,工艺开发工程师们必须放弃由硅、二氧化硅、多晶硅和铝材料构成的良性世界,而将自己置于由硅锗(SiGe)、绝缘体上硅(SOI)、亚硝酸铪(HfNO2)、金属栅、低 ...… 查看全部问答∨ |
求助:我通过platform builter5.0下载WINCE nk.bin文件到ARM板中,提示如下错误: Warning: Debugger service map is set to none. If your image has debugging support it may not boot properly. Cannot access selecte ...… 查看全部问答∨ |
主要程序字库定义typedef struct typFont16 // 汉字字模数据结构 { signed char Index[2]; //汉字 uc16 Msk[16] ...… 查看全部问答∨ |
|
提问:冬季轿车起动不着常见的原因及解决办法? 回答:造成这种情况有几种原因,电瓶亏电、汽油流动受阻、点火系统工作状态不好、气门结胶、排气管结冻等。 电瓶亏电———其表现特点是起动机开始转但转速不够即无力,后来起动机只咔 ...… 查看全部问答∨ |
|
我想请教一下,芯片CDCM7005为什么要与一个参考时钟同步,才能输出低抖动时钟呢? 我只是想用该芯片将一路时钟驱动为4路时钟而已,但不知道参考时钟应该怎么选择?标准是什么呢?谢谢… 查看全部问答∨ |