关于武汉芯景科技有限公司的IIC转UART接口芯片XJ2101开发指南

一、芯片介绍

1.芯片引脚

二、硬件环境

1.STM32F407单片机

2.XJ2101芯片

三、功能描述

1.寄存器描述

2.功能

黄色:TX

浅蓝:SDA

深蓝:SCL

四、软件程序

XJ2101.C

/*
 * XJ2101.c
 *
 *  Created on: 2024年7月4日
 *      Author: Administrator
 */
#include "XJ2101.h"
#include "softiic.h"
#include "tim.h"

uint8_t contr_data=0;/*存放控制寄存器数据*/

/**************************************************************/
/*
 * 配置SHDN引脚,让其实现软件的开关芯片
 * 开关一次芯片,将缓冲区清零
 * 设置波特率
 */
/**************************************************************/
void XJ2101_Init(void)
{
	XJ2101_GPIO_Init();
	XJ2101_OFF();
	TIM_delay_ms(100);
	XJ2101_ON();
	XJ2101_Baudrate(UART_115200);
}



/**************************************************************/
/*
 * 配置SHDN引脚
 *
 */
/**************************************************************/
void XJ2101_GPIO_Init(void)
{
	  GPIO_InitTypeDef GPIO_InitStruct = {0};

	  /* GPIO Ports Clock Enable */
	  __HAL_RCC_GPIOD_CLK_ENABLE();

	  /*Configure GPIO pin Output Level */
	  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13, GPIO_PIN_RESET);

	  /*Configure GPIO pins : PDPin PDPin PDPin PDPin */
	  GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13;
	  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	  GPIO_InitStruct.Pull = GPIO_NOPULL;
	  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}



/**************************************************************/
/*
 * 开启芯片
 * 当SHDN重新置低后,系统恢复正常工作,所有寄存器恢复到关断前状态(I2C和UART数据缓冲区数据全部清空)
 */
/**************************************************************/
void XJ2101_ON(void)
{
	XJ2101_SHDN_LOW();
}

/**************************************************************/
/*
 * 关闭芯片
 * 当SHDN管脚置高时,芯片进入关断功能状态。这时所有通讯接口均进入高阻态,系统进入低功耗状态。
 *
 */
/**************************************************************/
void XJ2101_OFF(void)
{
	XJ2101_SHDN_HIGH();
}


/**************************************************************/
/*
 * UART波特率设置由控制寄存器的0~4位来决定
 * 参数Baudrate可以设置波特率
 *
 */
/**************************************************************/
void XJ2101_Baudrate(uint8_t Baudrate)
{
	contr_data=ReadOneByte(CONTR_Register);
	contr_data= ( contr_data & 0xf0 ) | Baudrate ;
	WriteOneByte(CONTR_Register,contr_data);
}



/**************************************************************/
/*
 * RTS的控制,RTS是输出引脚
 * 当我接收区没有满,可以接受UART数据时,将RTS位置高,RTS引脚电平置为低,对方的CTS读到低电平就发数据
 * 当我接收区满了,不可以接受UART数据时,将RTS位置为低,RTS引脚电平置为高,对方的CTS读到高电平就停止发数据
 * RTS位为0,引脚电平为高;RTS位为1,引脚电平为低
 *
 */
/**************************************************************/
void Set_RTS_Low(void)
{
	contr_data=ReadOneByte(CONTR_Register);
	contr_data|= (1<<5);/*设置RTS位为高,允许对方发送数据,RTS引脚电平为低*/
	WriteOneByte(CONTR_Register,contr_data);
}

void Set_RTS_High(void)
{
	contr_data=ReadOneByte(CONTR_Register);
	contr_data&=(~(1<<5));/*设置RTS位为低,允许对方发送数据,RTS引脚电平为高*/
	WriteOneByte(CONTR_Register,contr_data);
}



/**************************************************************/
/*
 * CTS的控制,CTS是输入引脚
 * 当CTS引脚读取到低电平的时候,对方接收区没有满,我可以向对方发送数据
 * 当CTS引脚读取到高电平的时候,对方接收区满了,我不能向对方发送数据
 * 函数的返回值为CTS的值
 */
/**************************************************************/
int cts_flag=0;
uint8_t Read_CTS_flag(void)
{
	 contr_data=ReadOneByte(CONTR_Register);
	 if( contr_data & (1<<4) )   cts_flag=0;   /* CTS管脚为低  */
	 else   cts_flag=1;                 /* CTS 管脚为高 */
     return cts_flag;
}


/**************************************************************/
/*
 * IQR是输出引脚
 * UART 接收缓冲接收到新数据时,开漏极中断激活(IRQ=低)
 * 当 UART接收缓冲区数据为空时,开漏极中断取消(IRQ=高)
 * 函数的返回值为IRQ的状态,返回1为高电平,返回0为低电平
 */
/**************************************************************/
int irq_flag=0;
int uartbuf_data=0;
uint8_t Read_IRQ_flag(void)
{
	uartbuf_data=ReadOneByte(UARTBUF_Register);
	if(uartbuf_data==0)   irq_flag=1;
	else irq_flag=0;
	return irq_flag;
}



/**************************************************************/
/*
 * IIC数据缓冲区清空设置
 */
/**************************************************************/
void Clear_I2CBUF_Data(void)
{
	contr_data=ReadOneByte(CONTR_Register);
	contr_data|= (1<<7);
	WriteOneByte(CONTR_Register,contr_data);
}


/**************************************************************/
/*
 * UART数据缓冲区清空设置
 */
/**************************************************************/
void Clear_UARTBUF_Data(void)
{
	contr_data=ReadOneByte(CONTR_Register);
	contr_data|= (1<<8);
	WriteOneByte(CONTR_Register,contr_data);
}


/**************************************************************/
/*
 * 函数返回值为UART接收缓冲区字节数
 */
/**************************************************************/
uint8_t Read_UARTBUF_Num(void)
{
	uint8_t uartbuf_num=0;
	uartbuf_num=ReadOneByte(UARTBUF_Register);
	return uartbuf_num;
}


/**************************************************************/
/*
 * 函数返回值为IIC接收缓冲区字节数
 */
/**************************************************************/
uint8_t Read_I2CBUF_Num(void)
{
	uint8_t iicbuf_num=0;
	iicbuf_num=ReadOneByte(I2CBUF_Register);
	return iicbuf_num;
}



XJ2101.H

/*
 * XJ2101.h
 *
 *  Created on: 2024年7月4日
 *      Author: Administrator
 */


#ifndef INC_XJ2101_H_
#define INC_XJ2101_H_

#include "XJ2101.h"
#include "stdint.h"

#define WR_Register          0x00             /*数据读寄存器*/
#define RD_Register          0x00             /*数据写寄存器*/
#define UARTBUF_Register     0x01             /*UART接收缓存接收字节数*/
#define I2CBUF_Register      0x02             /*I2C可加载字节数*/
#define CONTR_Register     0x03             /*UART接口控制寄存器*/



#define XJ2101_SHDN_HIGH() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET)/*关闭芯片*/
#define XJ2101_SHDN_LOW() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET)/*打开芯片*/

/*定义XJ2101波特率*/
enum Uart_Baudrate
{
	UART_9600=0x00,
	UART_300,
	UART_600,
	UART_900,
	UART_1200,
	UART_1800,
    UART_2400,
    UART_3600,
    UART_4800,
    UART_7200,
	UART_14400,
    UART_19200,
	UART_28800,
	UART_38400,
	UART_57600,
    UART_115200
};

void XJ2101_Init(void);
void XJ2101_GPIO_Init(void);
void XJ2101_ON(void);
void XJ2101_OFF(void);
void XJ2101_Baudrate(uint8_t Baudrate);
void Set_RTS_High(void);
void Set_RTS_Low(void);
uint8_t Read_CTS_flag(void);
void Clear_I2CBUF_Data(void);
void Clear_UARTBUF_Data(void);
uint8_t Read_UARTBUF_Num(void);
uint8_t Read_I2CBUF_Num(void);
uint8_t Read_IRQ_flag(void);



#endif /* __XJ2101_H__ */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值