【CH9434】使用CH9434移植到32单片机扩展4串口

您所在的位置:网站首页 串口扩展芯片CH432 【CH9434】使用CH9434移植到32单片机扩展4串口

【CH9434】使用CH9434移植到32单片机扩展4串口

2024-07-10 22:15| 来源: 网络整理| 查看: 265

CH9434是一款串口扩展芯片,功能是通过SPI接口可以扩展4路串口出来,通过相应的232串口、485串口芯片,可以扩展相应的接口。

该项目通过STM32的SPI接口扩展4路串口出来,通过串口收发数据。

目录

一、硬件准备

二、资料准备

三、CODE

四、硬件连接

五、测试&结果

一、硬件准备 主控板一个,这里选择的是STM32F103评估板CH9434评估板杜邦线若干 二、资料准备 使用沁恒提供的CH9434数据手册一份http://www.wch.cn/downloads/CH9434DS1_PDF.html使用沁恒提供的参考代码一份http://www.wch.cn/downloads/CH9434EVT_ZIP.html 三、CODE

1.选择一个能编译的工程,将下载好的参考代码放置工程文件夹,添加C文件以及H文件路径。

2.将提供的main函数里的几个函数移植好,接口函数如下。

/* US延时函数 */ void CH9434_US_DELAY(void) { delay_us(1); } /* SPI接口SCS引脚控制,0:低电平 1:高电平 */ void CH9434_SPI_SCS_OP(u8_t dat) { if(dat) GPIO_SetBits(GPIOB, GPIO_Pin_12); else GPIO_ResetBits(GPIOB, GPIO_Pin_12); } /* SPI交换一个字节接口 */ u8_t CH9434_SPI_WRITE_BYTE(u8_t dat) { u8_t temp; while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); SPI_I2S_SendData(SPI2, dat); while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET); temp = SPI_I2S_ReceiveData(SPI2); return temp; }

3.为方便测试,提供一个可以查询所有CH9434寄存器的函数void CH9434UARTxTest(u8_t uart_idx)

该函数可以打印CH9434对应串口的所有寄存器的值

void WriteCH9434Data( u8_t mAddr, u8_t mData ) /* 向指定寄存器写入数据 */ { CH9434_SPI_SCS_OP(0); CH9434_SPI_WRITE_BYTE( ( mAddr ) | 0x80 ); /* 位5-2为当前操作地址,位1为1写操作 */ delay_us (2); CH9434_SPI_WRITE_BYTE( mData ); CH9434_SPI_SCS_OP(1); //Spi432Stop( ); } u8_t ReadCH9434Data( u8_t mAddr ) /* 从指定寄存器读取数据 */ { u8_t d; CH9434_SPI_SCS_OP(0); CH9434_SPI_WRITE_BYTE( mAddr ); /* 位5-2为当前操作地址,位1为0读操作 */ delay_us (2); d = CH9434_SPI_WRITE_BYTE( 0xFF ); CH9434_SPI_SCS_OP(1); //Spi432Stop( ); return( d ); } /******************************************************************************* * Function Name : CH9434UARTxTest * Description : 枚举所有寄存器的值 * Input : * Output : None * Return : None *******************************************************************************/ void CH9434UARTxTest(u8_t uart_idx) { u8_t s,i,j; u8_t uart_reg_add; //CLK_CTRL寄存器读取 i = ReadCH9434Data( CH9434_CLK_CTRL_CFG_ADD+0x10*uart_idx ); printf("CLK_CTRL=%02X\n", i ); //RBR寄存器读取 j=(s&0x80); if(j==0) //DLAB=0 { i = ReadCH9434Data( CH9434_UARTx_RBR_ADD+0x10*uart_idx ); printf("RBR1=%02X\n", i ); } if(j!=0) //DLAB=1 { WriteCH9434Data( CH9434_UARTx_LCR_ADD+0x10*uart_idx, s&0x7f ); i = ReadCH9434Data( CH9434_UARTx_RBR_ADD+0x10*uart_idx ); printf("RBR2=%02X\n", i ); WriteCH9434Data( CH9434_UARTx_LCR_ADD+0x10*uart_idx, s ); } //IER寄存器读取 s = ReadCH9434Data( CH9434_UARTx_LCR_ADD+0x10*uart_idx ); j=(s&0x80); if(j==0) //DLAB=0 i = ReadCH9434Data( CH9434_UARTx_IER_ADD+0x10*uart_idx ); printf("IER1=%02X\n", i ); if(j!=0) //DLAB=1 { WriteCH9434Data( CH9434_UARTx_LCR_ADD+0x10*uart_idx, s&0x7f ); i = ReadCH9434Data( CH9434_UARTx_IER_ADD+0x10*uart_idx ); printf("IER2=%02X\n", i ); WriteCH9434Data( CH9434_UARTx_LCR_ADD+0x10*uart_idx, s ); } //IIR寄存器读取 i = ReadCH9434Data( CH9434_UARTx_IIR_ADD+0x10*uart_idx ); printf("IIR=%02X\n", i ); //LCR寄存器读取 i = ReadCH9434Data( CH9434_UARTx_LCR_ADD+0x10*uart_idx ); printf("LCR=%02X\n", i ); //MCR寄存器读取 i = ReadCH9434Data( CH9434_UARTx_MCR_ADD+0x10*uart_idx ); printf("MCR=%02X\n", i ); //LSR寄存器读取 i = ReadCH9434Data( CH9434_UARTx_LSR_ADD+0x10*uart_idx ); printf("LSR=%02X\n", i ); //MSR寄存器读取 i = ReadCH9434Data( CH9434_UARTx_MSR_ADD+0x10*uart_idx ); printf("MSR=%02X\n", i ); //SCR寄存器读取 i = ReadCH9434Data( CH9434_UARTx_SCR_ADD+0x10*uart_idx ); printf("SCR=%02X\n", i ); //DLL寄存器读取 s = ReadCH9434Data( CH9434_UARTx_LCR_ADD+0x10*uart_idx ); j=(s&0x80); if(j!=0) //DLAB=1 { i = ReadCH9434Data( CH9434_UARTx_DLL_ADD+0x10*uart_idx ); printf("DLL1=%02X\n", i ); } if(j==0) //DLAB=0 { WriteCH9434Data( CH9434_UARTx_LCR_ADD+0x10*uart_idx, 0xff ); i = ReadCH9434Data( CH9434_UARTx_DLL_ADD+0x10*uart_idx ); printf("DLL2=%02X\n", i ); WriteCH9434Data( CH9434_UARTx_LCR_ADD+0x10*uart_idx, s ); } //DLM寄存器读取 s = ReadCH9434Data( CH9434_UARTx_LCR_ADD+0x10*uart_idx ); j=(s&0x80); if(j!=0) //DLAB=1 { i = ReadCH9434Data( CH9434_UARTx_DLM_ADD+0x10*uart_idx ); printf("DLM1=%02X\n", i ); } if(j==0) //DLAB=0 { WriteCH9434Data( CH9434_UARTx_LCR_ADD+0x10*uart_idx, 0xff ); i = ReadCH9434Data( CH9434_UARTx_DLM_ADD+0x10*uart_idx ); printf("DLM2=%02X\n", i ); WriteCH9434Data( CH9434_UARTx_LCR_ADD+0x10*uart_idx, s ); } }

 

四、硬件连接

   STM32        CH9434     PB15 SDI     PB14 SDO     PB13 SCK     PB12 CS     PB10 INT  

五、测试&结果

移植代码成功

官方提供的代码本来就是基于STM32的代码,所以移植起来很快,基本没有修改的地方。如果是其他平台的主控单片机,需要修改的就是接口函数的3个地方,如下

/* US延时函数 */ void CH9434_US_DELAY(void);

/* SPI接口SCS引脚控制,0:低电平  1:高电平 */  void CH9434_SPI_SCS_OP(u8_t dat);

/* SPI交换一个字节接口 */ u8_t CH9434_SPI_WRITE_BYTE(u8_t dat); 将以上三个函数改成对应自己主控的函数即可

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3