一、芯片引脚介绍及应用电路

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__ */

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐