The general software simulation method of expanding the serial port uses 1 I/O port, 1 INT external interrupt and timer. This method has two disadvantages: 1. Due to the use of INT external interrupt, only 2 INT external interrupts can be used to expand 2 serial ports. 2. The efficiency of sending and receiving data in this article is relatively low, which occupies a lot of CPU time and cannot be performed simultaneously with other tasks, so the scope of use is limited.
The simulated serial port method proposed in this paper only uses 2 ordinary I/Os and 1 timer. Since it does not require the limitation of INT, it can expand multiple serial ports with FIFO function. This method expands the simulated serial port's sending and receiving data in the interrupt service, so it is very efficient. Generally, the microcontroller supports timer interrupt, so this method can be applied to most microcontrollers.
For low-speed microcontrollers (such as 89S51), low-speed serial ports (9600, 4800, etc.) can be expanded. For high-speed microcontrollers (such as AVR, PIC, C8051, STC12), high-speed serial ports (such as 19200, 28800, 38400, 57600, etc.) can be expanded. Currently, the processing speed of microcontrollers is getting higher and higher, and the price is getting cheaper and cheaper. The STC12C1052 chip used in this article has high speed and low price, and the price is only RMB 3.8 per piece. When developing and designing electronic products, it is required to reduce hardware costs while ensuring performance. Software simulation and expansion of serial ports provide a good way to reduce costs.
1. Serial communication principle
In the asynchronous communication of the serial port, data is transmitted in byte frames with bytes as the unit. The sender and the receiver must communicate according to the same byte frame format and baud rate. The byte frame format specifies the start bit, data bit, parity bit, and stop bit. The start bit is the beginning of the byte frame, which puts the data line in the logic 0 state, used to indicate to the receiver that the data frame has started to be sent, so as to synchronize the sending and receiving devices. The stop bit is the end of the byte frame, which puts the data line in the logic 1 state, used to indicate to the receiver that the data frame has been sent. The baud rate uses standard speeds, such as 4800, 9600, 19200, 28800, 38400, 57600, etc.
2. Design idea of software UART
In terms of hardware requirements for this design, it only occupies any two I/O ports and one timer of the microcontroller, and uses the timer interrupt function of the timer to achieve precise baud rate timing. Both sending and receiving are carried out under the control of the timer interrupt.
The idea of data transmission is that when the byte transmission is started, the start bit is sent first through TxD, then the data bit and the parity check bit are sent, and finally the stop bit is sent. The sending process is controlled by the sending state machine. Only one bit is sent each time the interrupt is interrupted. After several timed interrupts, the sending of one byte frame is completed.
The idea of data reception is that when it is not in the byte frame reception process, each timer interrupt monitors the state of RxD at 3 times the baud rate. When its sampling level is 1, 0, and 0 for three consecutive times, it is considered that the start bit is detected, and a byte frame reception is started. The byte frame reception process is controlled by the receiving state machine. Each interrupt only receives 1 bit, and the reception of 1 byte frame is completed after several timer interrupts.
In order to improve the performance of the serial port, the FIFO function is implemented in both sending and receiving to improve the real-time communication. The length of the FIFO can be freely defined to meet the different needs of users.
The baud rate is calculated according to the calculation formula. When setting the highest baud rate, the execution time of the simulated serial port program code must be considered. The timing time must be greater than the specified time of the simulated serial port program. The faster the execution speed of the microcontroller, the higher the serial port communication speed can be achieved.
3. Implementation of software UART design
This program is tested on the STC12C1052 high-speed microcontroller produced by Hongjing Technology (Shenzhen). The STC12C1052 microcontroller is a single-clock/machine cycle MCS51 core microcontroller, which is fully compatible with the 89C2051 pins. Its operating frequency is 35MHz, which is equivalent to the 420MHz 89C2051 microcontroller. Each piece costs RMB 3.8. Due to the high speed of the microcontroller, the software expansion serial port method is more convenient to achieve high-speed serial ports.
In the design of this extended serial port, the crystal frequency of STC12C1052 is 22.1184Mhz. The timing is calculated as 3 times the baud rate. During the receiving process, this timing is used to sample the receive start bit. During the sending and receiving process, the frequency is divided by 3 to obtain the standard baud rate timing for data sending and receiving.
3.1 Data Definition
Define some resources necessary for simulating serial port programs, such as I/O pins, baud rate, data buffer, etc.
#define Fosc 22118400 //Crystal oscillator frequency
#define Baud 38400 //Baud rate
#define BaudT (Fosc/Baud/3/12)
#define BufLong 16 //FIFO length
sbit RxD1=P1^7; //Simulate receiving RxD
sbit TxD1=P1^6; //Simulate sending TxD
bit Brxd1,Srxd1; //RxD detection level
BYTE Rbuf1[BufLong]; //FIFO receiving area
BYTE Rptr1,Rnum1;
BYTE Tbuf1[BufLong]; //FIFO send area
BYTE Tptr1,Tnum1;
BYTE TimCnt1A,TimCnt1B;
BYPASS Mtbuf1,Mrbuf1,TxdCnt1,RxdCnt1;
3.2 Data receiving subroutine
During the data reception process, the logical bits of RxD are stored in sequence to form byte data. When the data reception is completed and the stop bit is 1, it means that valid data has been received, and the result is stored in the receive FIFO queue.
void Recv()
{
if(RxdCnt1>0) //Store 8 data bits
{
Mrbuf1>>=1;
if(RxD1==1) Mrbuf1=Mrbuf1|0x80;
}
RxdCnt1--;
if(RxdCnt1==0&& RxD1==1) //Data reception completed
{
Rbuf1[Rptr1]=Mrbuf1; //Store in FIFO queue
if(++Rptr1>BufLong-1) Rptr1=0;
if(++Rnum1>BufLong) Rnum1=BufLong;
}
}
3.3 Data sending subroutine
During the program, when the data sending state ends, it checks whether the sending FIFO queue is empty. If it is not empty, the sending data is taken out and then the sending state is started; when in the sending state, the start bit, data bit and stop bit are sent according to the state of the state machine.
void Send()
{
if(TxdCnt1!=0) //Byte sending state machine
{
if(TxdCnt1==11) TxD1=0; //send start bit 0
else if(TxdCnt1>2) //send data bit
{ Mtbuf1>>=1; TxD1=CY;}
else TxD1=1; //send termination bit 1
TxdCnt1--;
}
else if(Tnum1>0) //Detect FIFO queue
{
Tnum1--;
Mtbuf1=Tbuf1[Tptr1]; //Read FIFO data
if(++Tptr1>=BufLong) Tptr1=0;
TxdCnt1=11; //Start the sending state machine
}
}
3.4. Interrupt Program
The interrupt timing time is 1/3 of the baud rate timing, that is, the RxD is sampled at 3 times the baud rate to realize the judgment of the start bit, and the receiving process state machine is started when the start bit arrives. The timing is divided by 3 and the data sending and receiving process is called to perform serial communication at an accurate baud rate.
void Uart() interrupt 1 using 1
{
if(RxdCnt1==0 ) //Receive start identification
{
if(RxD1==0 && Brxd1==0 && Srxd1==1) { RxdCnt1=8; TimCnt1B=0;}
}
Srxd1=Brxd1; Brxd1=RxD1;
if(++TimCnt1B>=3 && RxdCnt1!=0) { TimCnt1B=0; Recv();}//Data reception
if(++TimCnt1A>=3) { TimCnt1A=0; Send();} //Data sending
}
3.5. Serial port initialization
Enable the timer interrupt, set the timer to self-loading mode, set the timer interrupt interval according to the baud rate, start the timer, and initialize the UART variables.
void IniUart()
{
IE="0x82"; TMOD="0x22";
TH0=-BaudT; TL0=-BaudT; TR0=1;
Rptr1=0;Rnum1=0;Tptr1=0;Tnum1=0;
}
4 Conclusion
The analog serial port design method proposed in this paper is unique in that it realizes a full-duplex serial port by using only two ordinary I/O pins and one timer interrupt, occupies less hardware, and has the ability to expand multiple serial ports; a continuous three-time sampling method is used to determine the start bit of the serial port reception, which is simple to implement and has high accuracy; the serial port data is sent and received using a timer interrupt, and a FIFO queue is implemented, making the serial port sending and receiving work efficient.
Previous article:MCU communication protocol processing
Next article:FAQs about IAR Compilers
Recommended ReadingLatest update time:2024-11-16 20:30
- Popular Resources
- Popular amplifiers
- Wireless Sensor Network Technology and Applications (Edited by Mou Si, Yin Hong, and Su Xing)
- Modern Electronic Technology Training Course (Edited by Yao Youfeng)
- Modern arc welding power supply and its control
- Small AC Servo Motor Control Circuit Design (by Masaru Ishijima; translated by Xue Liang and Zhu Jianjun, by Masaru Ishijima, Xue Liang, and Zhu Jianjun)
Professor at Beihang University, dedicated to promoting microcontrollers and embedded systems for over 20 years.
- Innolux's intelligent steer-by-wire solution makes cars smarter and safer
- 8051 MCU - Parity Check
- How to efficiently balance the sensitivity of tactile sensing interfaces
- What should I do if the servo motor shakes? What causes the servo motor to shake quickly?
- 【Brushless Motor】Analysis of three-phase BLDC motor and sharing of two popular development boards
- Midea Industrial Technology's subsidiaries Clou Electronics and Hekang New Energy jointly appeared at the Munich Battery Energy Storage Exhibition and Solar Energy Exhibition
- Guoxin Sichen | Application of ferroelectric memory PB85RS2MC in power battery management, with a capacity of 2M
- Analysis of common faults of frequency converter
- In a head-on competition with Qualcomm, what kind of cockpit products has Intel come up with?
- Dalian Rongke's all-vanadium liquid flow battery energy storage equipment industrialization project has entered the sprint stage before production
- Allegro MicroSystems Introduces Advanced Magnetic and Inductive Position Sensing Solutions at Electronica 2024
- Car key in the left hand, liveness detection radar in the right hand, UWB is imperative for cars!
- After a decade of rapid development, domestic CIS has entered the market
- Aegis Dagger Battery + Thor EM-i Super Hybrid, Geely New Energy has thrown out two "king bombs"
- A brief discussion on functional safety - fault, error, and failure
- In the smart car 2.0 cycle, these core industry chains are facing major opportunities!
- The United States and Japan are developing new batteries. CATL faces challenges? How should China's new energy battery industry respond?
- Murata launches high-precision 6-axis inertial sensor for automobiles
- Ford patents pre-charge alarm to help save costs and respond to emergencies
- New real-time microcontroller system from Texas Instruments enables smarter processing in automotive and industrial applications
- [Erha Image Recognition Artificial Intelligence Vision Sensor] 6. Identify motors and control their operation
- [N32L43x Review] DAC various waveform output tests
- ST60 millimeter wave water medium data transmission test report——part1
- STM32 core Arduino board-ZeroKnow mini board with small size
- Programming examples to learn DSP timer and interrupt system
- TI Battery Tester Reference Design for High Current Applications
- [ESK32-360 Review] + TFT screen display function and expansion (1)
- [NXP Rapid IoT Review] Part 2: Detailed tutorial of online IDE - Open Rapid IoT to see the weather...
- 【GD32L233C-START Review】3. Implementation of USB keyboard
- Master the wireless communication signal transmission model in one article