一、芯片介绍
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__ */