第二章:POS机硬件架构概览
做POS机开发这些年,我拆过的机器少说也有几十款了。每次拿到新板子,第一件事就是看它的硬件架构。说白了,搞懂硬件,你写代码才有底气。今天咱们就来聊聊POS机的硬件骨架——主控芯片、外设接口、电源管理这三块。
2.1 主控芯片:POS机的大脑
主控芯片选什么,直接决定了你的开发难度和成本。我个人习惯把主控分成三类:
- 通用MCU:比如STM32系列,适合功能简单的密码键盘、手持终端
- 专用SoC:像联发科、展锐的支付芯片,内置安全模块,省事
- 应用处理器:跑Linux/Android的,比如全志、瑞芯微,适合智能POS
这里有个坑,我刚开始做项目时踩过——千万别只看主频。有一次我选了个200MHz的MCU,觉得够用了,结果跑起加密算法和LCD刷新,CPU占用率直接飙到90%。后来换了带硬件加密引擎的芯片,同样的活儿,占用率降到20%。
核心要点:主控选型要关注三点——处理能力、外设资源、安全特性。别光看主频,要看实际负载。
2.2 外设接口:连接世界的通道
POS机的外设接口,说白了就是跟外部设备打交道的管道。我按使用频率排个序:
2.2.1 串口(UART)
串口是最基础的接口,用来接打印机、密码键盘、扫码枪。你想想看,一个POS机可能同时接3-4个串口设备。
我在项目中遇到过一个问题:两个串口设备同时发数据,结果数据互相干扰。排查了半天,发现是中断优先级没配好。后来我养成了习惯——每个串口独立分配中断优先级,并且用DMA传输。
// 串口初始化示例(STM32)
void UART_Init(void)
{
// 配置波特率115200,8位数据,1位停止位
USART_InitTypeDef usart;
usart.USART_BaudRate = 115200;
usart.USART_WordLength = USART_WordLength_8b;
usart.USART_StopBits = USART_StopBits_1;
usart.USART_Parity = USART_Parity_No;
// 使能DMA传输,减少CPU负担
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
}
避坑指南:我曾经因为串口波特率不匹配,导致打印机乱码。后来统一规定:所有串口设备波特率固定为115200,除非特殊需求。
2.2.2 I2C接口
I2C主要接一些小器件:触摸屏、传感器、EEPROM。它的好处是只用两根线,省引脚。但坏处是——速度慢,容易受干扰。
我记得有一次,触摸屏偶尔失灵,查了三天。最后发现是I2C总线上拉电阻选小了,导致信号边沿太缓。嗯,这里要注意:I2C总线的上拉电阻要根据总线电容和速度来算,不能随便焊个4.7kΩ了事。
| 总线速度 | 推荐上拉电阻 | 总线电容 |
|---|---|---|
| 100kHz(标准模式) | 4.7kΩ - 10kΩ | < 400pF |
| 400kHz(快速模式) | 1.5kΩ - 4.7kΩ | < 200pF |
| 1MHz(快速+模式) | 1kΩ - 2.2kΩ | < 100pF |
2.2.3 SPI接口
SPI是速度之王,用来接LCD屏幕、SD卡、加密芯片。它的速度可以跑到几十MHz,但代价是引脚多——至少4根线。
我建议:SPI通信一定要用DMA。为什么?因为SPI是同步通信,CPU如果逐字节发送,会被卡死。用DMA的话,CPU可以干别的事,比如处理按键、更新界面。
// SPI DMA发送示例
void SPI_SendData_DMA(uint8_t *data, uint16_t len)
{
// 配置DMA通道
DMA_InitTypeDef dma;
dma.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR;
dma.DMA_MemoryBaseAddr = (uint32_t)data;
dma.DMA_BufferSize = len;
dma.DMA_DIR = DMA_DIR_PeripheralDST;
// 启动DMA传输
DMA_Cmd(DMA1_Channel3, ENABLE);
}
2.3 电源管理:稳定是王道
电源管理这块,很多人不重视。但说实话,POS机死机、重启、数据丢失,80%是电源问题。
POS机的电源架构一般是这样:
- 输入:5V/9V/12V DC,或者锂电池
- 降压:3.3V给主控、外设,1.8V给DDR内存
- 升压:有些打印机需要24V
- 备份:纽扣电池给RTC供电
我踩过最大的坑是——电源纹波导致触摸屏误触。当时机器在店里用得好好的,一到收银高峰期就乱跳。后来用示波器一测,3.3V纹波有200mV。换了颗低ESR的电容,纹波降到30mV,问题解决。
警告:POS机电源设计要遵循三条铁律——1)输入加TVS管防浪涌;2)每颗芯片旁边放去耦电容;3)模拟和数字电源要分开走线。我曾经因为省了一颗电容,导致整批机器返厂。
还有个细节:掉电检测。POS机突然断电时,要保存交易数据。我一般用MCU的掉电中断,检测到电压低于阈值,立即把关键数据写入EEPROM。这个时间窗口通常只有几毫秒,代码要精简到极致。
// 掉电中断处理
void PVD_IRQHandler(void)
{
if(PWR_GetFlagStatus(PWR_FLAG_PVDO))
{
// 保存交易数据到EEPROM
SaveTransactionData();
// 关闭所有外设
DisableAllPeripherals();
}
}
好了,硬件架构就聊到这儿。下一章咱们深入代码层面,讲讲嵌入式C语言在POS机里的高效编程技巧。记住一句话:懂硬件,才能写出好软件。