关于SPI转UART接口芯片XJ3100开发指南(兼容MAX3100)
·
一、芯片引脚介绍及应用电路
1.芯片引脚


二、硬件环境
1. STM32F407单片机
2.XJ3100芯片
三、功能描述
1.寄存器介绍



2.功能
黄色:TX
浅蓝:MOSI
红色:CLK
深蓝色:CS

四、软件程序
AT3100.C
/*
* AT3100.c
*
* Created on: 2024年7月8日
* Author: Administrator
*/
#include "AT3100.h"
#include "softspi.h"
#include "stdint.h"
#include "softiic.h"
/***************************************************/
/*
* AT3100的写配置
*
*/
/***************************************************/
void AT3100_write_config(void)
{
CS_L;
SPI_WriteByte(0XC0);
SPI_WriteByte(0X00);
CS_H;
HAL_Delay(5);
}
/***************************************************/
/*
* AT3100的读配置
*
*/
/***************************************************/
uint16_t AT3100_read_config(void)
{
uint8_t data0=0,data1=0;
uint16_t config_data=0;
CS_L;
data1=SPI_ReadWriteByte (0X40);
data0=SPI_ReadWriteByte (0x00);
CS_H;
HAL_Delay(5);
config_data = (data1<<8) | data0;
return config_data;
}
/***************************************************/
/*
* AT3100的读配置,高八位
*
*/
/***************************************************/
uint8_t AT3100_read_config1(void)
{
uint8_t config1=0;
CS_L;
config1=SPI_ReadWriteByte (0X40);
SPI_ReadWriteByte (0x00);
CS_H;
HAL_Delay(5);
return config1;
}
/***************************************************/
/*
* AT3100的读配置,低八位
*
*/
/***************************************************/
uint8_t AT3100_read_config0(void)
{
uint8_t config0=0;
CS_L;
SPI_ReadWriteByte (0X40);
config0=SPI_ReadWriteByte (0x00);
CS_H;
HAL_Delay(5);
return config0;
}
/***************************************************/
/*
* AT3100的写数据,
*
*/
/***************************************************/
void AT3100_write_data(uint8_t data)
{
CS_L;
SPI_WriteByte(0X80);
SPI_WriteByte(data);
CS_H;
HAL_Delay(5);
}
/***************************************************/
/*
* AT3100的读数据,高八位和第八位
*
*/
/***************************************************/
uint16_t AT3100_read_data(void)
{
uint8_t data0=0,data1=0;
uint16_t data=0;
CS_L;
data1=SPI_ReadWriteByte (0X00);
data0=SPI_ReadWriteByte (0x00);
CS_H;
HAL_Delay(5);
data = (data1<<8) | data0;
return data;
}
/***************************************************/
/*
* AT3100的读数据,低八位(数据位)
*
*/
/***************************************************/
uint8_t AT3100_read_data0(void)
{
uint8_t data0=0;
CS_L;
SPI_ReadWriteByte (0X00);
data0=SPI_ReadWriteByte (0x00);
CS_H;
HAL_Delay(5);
return data0;
}
/***************************************************/
/*
* AT3100的读数据,高八位
*
*/
/***************************************************/
uint8_t AT3100_read_data1(void)
{
uint8_t data1=0;
CS_L;
data1=SPI_ReadWriteByte (0X00);
SPI_ReadWriteByte (0x00);
CS_H;
HAL_Delay(5);
return data1;
}
/**************************************************/
/*
* AT3100 读配置的 R位
* 函数返回0 R位为0 接收缓冲区没有新数据
* 函数返回1 R位为1 接收缓冲区有新数据
*
*/
/**************************************************/
uint16_t AT3100_R_flag(void)
{
uint16_t R_flag=0;
R_flag = AT3100_read_config() & 0x8000;
R_flag = R_flag >> 15;
return R_flag;
}
/**************************************************/
/*
* AT3100 读配置的 T位
* 函数返回0 T位为0 发送缓冲区没有新数据
* 函数返回1 T位为1 发送缓冲区有新数据
*
*/
/**************************************************/
uint16_t AT3100_T_flag(void)
{
uint16_t T_flag=0;
T_flag = AT3100_read_config() & 0x4000;
T_flag = T_flag >> 14;
return T_flag;
}
/**************************************************/
/*
* AT3100 读配置的 FEN位
* 函数返回0 FEN位为0 FIFO使能
* 函数返回1 FEN位为1 FIFO关闭
*
*/
/**************************************************/
uint16_t AT3100_FEN_flag(void)
{
uint16_t FEN_flag=0;
FEN_flag = AT3100_read_config() & 0x2000;
FEN_flag = FEN_flag >> 13;
return FEN_flag;
}
/**************************************************/
/*
* AT3100 读配置的 SHDN位
* 函数返回0 SHDN位为0 正常工作模式、SHDN接高电平
* 函数返回1 SHDN位为1 关闭模式、SHDN接低电平
*
*/
/**************************************************/
uint16_t AT3100_SHDN_flag(void)
{
uint16_t SHDN_flag=0;
SHDN_flag = AT3100_read_config() & 0x1000;
SHDN_flag = SHDN_flag >> 12;
return SHDN_flag;
}
/**************************************************/
/*
* AT3100 读配置的 TM位
* 函数返回0 TM位为0 发送缓存区为空,不产生中断
* 函数返回1 TM位为1 发送缓存区为空,产生中断
*
*/
/**************************************************/
uint16_t AT3100_TM_flag(void)
{
uint16_t TM_flag=0;
TM_flag = AT3100_read_config() & 0x0800;
TM_flag = TM_flag >> 11;
return TM_flag;
}
/**************************************************/
/*
* AT3100 读配置的 RM位
* 函数返回0 TM位为0 有数据到达发送缓存区,不产生中断
* 函数返回1 TM位为1 有数据到达发送缓存区,产生中断
*
*/
/**************************************************/
uint16_t AT3100_RM_flag(void)
{
uint16_t RM_flag=0;
RM_flag = AT3100_read_config() & 0x0400;
RM_flag = RM_flag >> 10;
return RM_flag;
}
/**************************************************/
/*
* AT3100 读配置的 PM位
* 函数返回0 PM位为0 有数据到达发送缓存区,不产生中断
* 函数返回1 PM位为1 有数据到达发送缓存区,产生中断
*
*/
/**************************************************/
uint16_t AT3100_PM_flag(void)
{
uint16_t PM_flag=0;
PM_flag = AT3100_read_config() & 0x0200;
PM_flag = PM_flag >> 9;
return PM_flag;
}
/**************************************************/
/*
* AT3100 读配置的 RAM位
* 函数返回0 RAM位为0 检测到数据奇偶校验错误时,不产生中断
* 函数返回1 RAM位为1 检测到数据奇偶校验错误时,产生中断
*
*/
/**************************************************/
uint16_t AT3100_RAM_flag(void)
{
uint16_t RAM_flag=0;
RAM_flag = AT3100_read_config() & 0x0100;
RAM_flag = RAM_flag >> 8;
return RAM_flag;
}
/**************************************************/
/*
* AT3100 读配置的 IR位
* 函数返回0 IR位为0 标准UART模式
* 函数返回1 IR位为1 IRDA模式
*
*/
/**************************************************/
uint16_t AT3100_IR_flag(void)
{
uint16_t IR_flag=0;
IR_flag = AT3100_read_config() & 0x0080;
IR_flag = IR_flag >> 7;
return IR_flag;
}
/**************************************************/
/*
* AT3100 读配置的 ST位
* 函数返回0 ST位为0 一个停止位
* 函数返回1 ST位为1 两个停止位
*
*/
/**************************************************/
uint16_t AT3100_ST_flag(void)
{
uint16_t ST_flag=0;
ST_flag = AT3100_read_config() & 0x0040;
ST_flag = ST_flag >> 6;
return ST_flag;
}
/**************************************************/
/*
* AT3100 读配置的 PE位
* 函数返回0 PE位为0 发送数据时,不添加奇偶校验位;接收数据时,也不添加奇偶校验位
* 函数返回1 PE位为1 发送数据时,添加奇偶校验位;接收数据时,添加奇偶校验位
*
*/
/**************************************************/
uint16_t AT3100_PE_flag(void)
{
uint16_t PE_flag=0;
PE_flag = AT3100_read_config() & 0x0020;
PE_flag = PE_flag >> 5;
return PE_flag;
}
/**************************************************/
/*
* AT3100 读配置的 L位
* 函数返回0 L位为0,PE位为0 发送8位字 L位为0,PE位为1 发送9位字
* 函数返回1 L位为1,PE位为0 发送7位字 L位为1,PE位为1 发送8位字
*
*/
/**************************************************/
uint16_t AT3100_L_flag(void)
{
uint16_t L_flag=0;
L_flag = AT3100_read_config() & 0x0010;
L_flag = L_flag >> 4;
return L_flag;
}
/**************************************************/
/*
* AT3100 读配置的 波特率位(D3-D0)
* 函数返回D3-D0位
*
*
*/
/**************************************************/
uint16_t AT3100_Baudrate_flag(void)
{
uint16_t Baudrate_flag=0;
Baudrate_flag = AT3100_read_config() & 0x000F;
return Baudrate_flag;
}
/**************************************************/
/*
* AT3100 读数据
* 函数返回0 RA/FE位为0
*
* 函数返回1 RA/FE位为1 正常模式下,FE表示帧错误或者缺少停止位;
* 关闭模式下,RA表示RX有数据到来
*
*/
/**************************************************/
uint16_t AT3100_RAorFE_flag(void)
{
uint16_t RAorFE_flag=0;
RAorFE_flag = AT3100_read_data() & 0x0400;
RAorFE_flag = RAorFE_flag >> 10;
return RAorFE_flag;
}
/**************************************************/
/*
* AT3100 读数据
* 函数返回0 CTS位为0 CTS输入引脚电平位高 不可以向对方发送
*
* 函数返回1 CTS位为1 CTS输入引脚电平位低 可以向对方发送
*
*/
/**************************************************/
uint16_t AT3100_CTS_flag(void)
{
uint16_t CTS_flag=0;
CTS_flag = AT3100_read_data() & 0x0200;
CTS_flag = CTS_flag >> 9;
return CTS_flag;
}
/***************************************************************************************/
/*
* AT3100 读数据
* PE=0 不做奇偶校验
* PE=1 数据后增加Pt位,作为数据位
*
* 例如:奇校验 总共9位数据,让1的个数时奇数个
* 数据:0000 0001 奇偶校验位 0
* 数据:0000 0011 奇偶校验位 1
*
* 偶校验 总共9位数据,让1的个数时偶数个
* 数据:0000 0001 奇偶校验位 1
* 数据:0000 0011 奇偶校验位 0
*
* 函数返回0 奇偶校验位为0
*
* 函数返回1 奇偶校验位为1
*
*/
/***************************************************************************************/
uint16_t AT3100_PR_flag(void)
{
uint16_t PR_flag=0;
PR_flag = AT3100_read_data() & 0x0100;
PR_flag = PR_flag >> 8;
return PR_flag;
}
/**************************************************/
/*
* AT3100 写配置FEN
* 输入SET 表示FIFO关闭
* 输入RESET 表示FIFO打开
*/
/**************************************************/
void AT3100_Write_FEN (uint8_t Write_FEN)
{
uint8_t data1=0,data0=0;
data1=AT3100_read_config1();
data0=AT3100_read_config0();
if(Write_FEN==1)
{
data1=data1|0X20;
}
else{
data1=data1&0XDF;
}
CS_L;
SPI_WriteByte(Write_Config|data1);
SPI_WriteByte(data0);
CS_H;
HAL_Delay(5);
}
/**************************************************/
/*
* AT3100 写配置SHDN
* 输入SET 表示芯片关闭模式
* 输入RESET 表示芯片打开模式
*/
/**************************************************/
void AT3100_Write_SHDN (uint8_t Write_SHDN)
{
uint8_t data1=0,data0=0;
data1=AT3100_read_config1();
data0=AT3100_read_config0();
if(Write_SHDN==1)
{
data1=data1|0X10;
}
else{
data1=data1&0XEF;
}
CS_L;
SPI_WriteByte(Write_Config|data1);
SPI_WriteByte(data0);
CS_H;
HAL_Delay(5);
}
/**************************************************/
/*
* AT3100 写配置TM
* 输入SET 发送缓冲区为空,不产生中断
* 输入RESET 发送缓冲区为空,产生中断
*
*/
/**************************************************/
void AT3100_Write_TM (uint8_t Write_TM)
{
uint8_t data1=0,data0=0;
data1=AT3100_read_config1();
data0=AT3100_read_config0();
if(Write_TM==1)
{
data1=data1|0X08;
}
else{
data1=data1&0XF7;
}
CS_L;
SPI_WriteByte(Write_Config|data1);
SPI_WriteByte(data0);
CS_H;
HAL_Delay(5);
}
/**************************************************/
/*
* AT3100 写配置RM
* 输入SET 有数据到达FIFO时,不产生中断
* 输入RESET 有数据到达FIFO时,产生中断
*
*/
/**************************************************/
void AT3100_Write_RM (uint8_t Write_RM)
{
uint8_t data1=0,data0=0;
data1=AT3100_read_config1();
data0=AT3100_read_config0();
if(Write_RM==1)
{
data1=data1|0X04;
}
else{
data1=data1&0XFB;
}
CS_L;
SPI_WriteByte(Write_Config|data1);
SPI_WriteByte(data0);
CS_H;
HAL_Delay(5);
}
/**************************************************/
/*
* AT3100 写配置PM
* 输入SET 检测到数据奇偶校验错误错误,不产生中断
* 输入RESET 检测到数据奇偶校验错误错误,产生中断
*
*/
/**************************************************/
void AT3100_Write_PM (uint8_t Write_PM)
{
uint8_t data1=0,data0=0;
data1=AT3100_read_config1();
data0=AT3100_read_config0();
if(Write_PM==1)
{
data1=data1|0X02;
}
else{
data1=data1&0XFD;
}
CS_L;
SPI_WriteByte(Write_Config|data1);
SPI_WriteByte(data0);
CS_H;
HAL_Delay(5);
}
/**************************************************/
/*
* AT3100 写配置RAM
* 输入SET SHDN模式检测到接收活动或者帧错误,不产生中断
* 输入RESET SHDN模式检测到接收活动或者帧错误,产生中断
*
*/
/**************************************************/
void AT3100_Write_RAM (uint8_t Write_RAM)
{
uint8_t data1=0,data0=0;
data1=AT3100_read_config1();
data0=AT3100_read_config0();
if(Write_RAM==1)
{
data1=data1|0X01;
}
else{
data1=data1&0XFE;
}
CS_L;
SPI_WriteByte(Write_Config|data1);
SPI_WriteByte(data0);
CS_H;
HAL_Delay(5);
}
/**************************************************/
/*
* AT3100 写配置IR
* 输入SET IR=1,IRDA模式
* 输入RESET IR=0,标准UART模式
*
*/
/**************************************************/
void AT3100_Write_IR (uint8_t Write_IR)
{
uint8_t data1=0,data0=0;
data1=AT3100_read_config1();
data0=AT3100_read_config0();
if(Write_IR==1)
{
data0=data0|0X80;
}
else{
data0=data0&0X7F;
}
CS_L;
SPI_WriteByte(Write_Config|data1);
SPI_WriteByte(data0);
CS_H;
HAL_Delay(5);
}
/**************************************************/
/*
* AT3100 写配置ST
* 输入SET ST=1,两个停止位
* 输入RESET ST=0,一个停止位
*
*/
/**************************************************/
void AT3100_Write_ST (uint8_t Write_ST)
{
uint8_t data1=0,data0=0;
data1=AT3100_read_config1();
data0=AT3100_read_config0();
if(Write_ST==1)
{
data0=data0|0X40;
}
else{
data0=data0&0XBF;
}
CS_L;
SPI_WriteByte(Write_Config|data1);
SPI_WriteByte(data0);
CS_H;
HAL_Delay(5);
}
/**************************************************/
/*
* AT3100 写配置PE
* 输入SET PE=1,添加奇偶校验位
* 输入RESET PE=0,不添加奇偶校验位
*
*/
/**************************************************/
void AT3100_Write_PE (uint8_t Write_PE)
{
uint8_t data1=0,data0=0;
data1=AT3100_read_config1();
data0=AT3100_read_config0();
if(Write_PE==1)
{
data0=data0|0X20;
}
else{
data0=data0&0XDF;
}
CS_L;
SPI_WriteByte(Write_Config|data1);
SPI_WriteByte(data0);
CS_H;
HAL_Delay(5);
}
/**************************************************/
/*
* AT3100 写配置L
* 输入SET L=1,7位数据
* 输入RESET L=0,8位数据
*
*/
/**************************************************/
void AT3100_Write_L (uint8_t Write_L)
{
uint8_t data1=0,data0=0;
data1=AT3100_read_config1();
data0=AT3100_read_config0();
if(Write_L==1)
{
data0=data0|0X10;
}
else{
data0=data0&0XEF;
}
CS_L;
SPI_WriteByte(Write_Config|data1);
SPI_WriteByte(data0);
CS_H;
HAL_Delay(5);
}
/**************************************************/
/*
* AT3100 写配置 波特率
*
*/
/**************************************************/
void AT3100_Write_Baudrate (uint8_t Write_Baudrate)
{
uint8_t data1=0,data0=0;
data1=AT3100_read_config1();
data0=AT3100_read_config0();
data0=data0&0xF0;
data0=data0|Write_Baudrate;
CS_L;
SPI_WriteByte(Write_Config|data1);
SPI_WriteByte(data0);
CS_H;
HAL_Delay(5);
}
/***************************************************/
/*
* AT3100的写数据,设置TE位,
* TE=1 禁止发送
* TE=0 允许发送
*/
/***************************************************/
void AT3100_write_TE(uint8_t data,uint8_t write_TE)
{
if(write_TE==0)
{
CS_L;
SPI_WriteByte(0X80);
SPI_WriteByte(data);
CS_H;
}
else
{
SPI_WriteByte(0X84);
SPI_WriteByte(data);
CS_H;
}
HAL_Delay(5);
}
/**************************************************/
/*
* AT3100 写数据
* 输入SET RTS=1,RTS引脚电平为高
* 输入RESET RTS=0,RTS引脚电平为低
*
*/
/**************************************************/
void AT3100_Write_RTS (uint8_t Write_RTS)
{
uint8_t data1=0,data0=0;
data1=AT3100_read_data1();
data0=AT3100_read_data0();
data1&=~0xC0;
if(Write_RTS==1)
{
data1|=0X02;
}
else
{
data1&=~0X02;
}
printf("data1=%x\r\n",Write_Data|data1);
CS_L;
SPI_WriteByte(Write_Data|data1);
SPI_WriteByte(data0);
CS_H;
HAL_Delay(5);
}
AT3100.H
/*
* AT3100.h
*
* Created on: 2024年7月8日
* Author: Administrator
*/
#ifndef INC_AT3100_H_
#define INC_AT3100_H_
#include "main.h"
#include <stdio.h>
#include "stdint.h"
#define Write_Config 3<<(3*2)
#define Read_Config 1<<(3*2)
#define Write_Data 2<<(3*2)
#define Read_data 0<<(3*2)
#define SET 1
#define RESET 0
#define ENABLE 1
#define DISABLE 0
/*使用3.3864MHZ的晶振,定义AT3100波特率*/
enum AT3100_Uart_Baudrate
{
AT3100_UART_230400=0x00,
AT3100_UART_115200,
AT3100_UART_57600,
AT3100_UART_28800,
AT3100_UART_14400,
AT3100_UART_7200,
AT3100_UART_3600,
AT3100_UART_1800,
AT3100_UART_76800,
AT3100_UART_38400,
AT3100_UART_19200,
AT3100_UART_9600,
AT3100_UART_4800,
AT3100_UART_2400,
AT3100_UART_1200,
AT3100_UART_600
};
void AT3100_write_config(void);
uint16_t AT3100_read_config(void);
uint8_t AT3100_read_config0(void);
uint8_t AT3100_read_config1(void);
void AT3100_write_data(uint8_t data);
uint16_t AT3100_read_data(void);
uint8_t AT3100_read_data0(void);
uint8_t AT3100_read_data1(void);
//读配置寄存器的位
uint16_t AT3100_FEN_flag(void);
uint16_t AT3100_TM_flag(void);
uint16_t AT3100_RM_flag(void);
uint16_t AT3100_PM_flag(void);
uint16_t AT3100_RAM_flag(void);
uint16_t AT3100_IR_flag(void);
uint16_t AT3100_ST_flag(void);
uint16_t AT3100_PE_flag(void);
uint16_t AT3100_L_flag(void);
uint16_t AT3100_Baudrate_flag(void);
//写配置寄存器的位
void AT3100_Write_FEN (uint8_t Write_FEN);
void AT3100_Write_SHDN (uint8_t Write_SHDN);
void AT3100_Write_TM (uint8_t Write_TM);
void AT3100_Write_RM (uint8_t Write_RM);
void AT3100_Write_PM (uint8_t Write_PM);
void AT3100_Write_RAM (uint8_t Write_RAM);
void AT3100_Write_IR (uint8_t Write_IR);
void AT3100_Write_ST (uint8_t Write_ST);
void AT3100_Write_PE (uint8_t Write_PE);
void AT3100_Write_L (uint8_t Write_L);
void AT3100_Write_Baudrate (uint8_t Write_Baudrate);
//读数据寄存器的位
uint16_t AT3100_RAorFE_flag(void);
uint16_t AT3100_CTS_flag(void);
uint16_t AT3100_PR_flag(void);
//写数据寄存器的位
void AT3100_write_TE(uint8_t data,uint8_t write_TE);
void AT3100_Write_RTS (uint8_t Write_RTS);
#endif /* __AT3100_H__ */
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)