CH9434是一款串口扩展芯片,功能是通过SPI接口可以扩展4路串口出来,通过相应的232串口、485串口芯片,可以扩展相应的接口。
该项目通过STM32的SPI接口扩展4路串口出来,通过串口收发数据。
目录
一、硬件准备
- 主控板一个,这里选择的是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);
将以上三个函数改成对应自己主控的函数即可