基于DSP28335的RS485串口通信与AD采样开发方案
一、系统架构设计
+---------------------+ +---------------------+
| DSP28335 MCU | | 外部设备 |
|---------------------| |---------------------|
| - SCIB串口 |<----->| RS485收发器(MAX3485)|
| - ADC模块 |<----->| 传感器/ADC输入 |
| - GPIO控制 | | LED/按键 |
+---------------------+ +---------------------+
二、硬件配置要点
-
RS485电路设计
-
使用MAX3485芯片,连接SCIB的TX/RX引脚
-
DE/RE引脚连接GPIO61(通过上拉电阻控制收发模式)
-
总线末端接120Ω匹配电阻,A/B线并联1kΩ偏置电阻
-
-
ADC配置
-
采样通道:选择通道0-7(对应INA0-INA7)
-
采样率:12.5MHz时钟,ACQ_PS=0xF(20个时钟周期采样)
-
转换模式:级联排序器(SEQ1+SEQ2)支持16通道
-
三、核心代码实现
1. RS485通信模块
// RS485初始化(SCIB)
void RS485_Init(Uint32 baud) {
EALLOW;
SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1; // 使能SCIB时钟
InitSciGpio(); // 初始化SCIB GPIO(默认配置)
// 配置GPIO61为收发控制引脚
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0; // 通用I/O
GpioCtrlRegs.GPBDIR.bit.GPIO61 = 1; // 输出模式
GpioDataRegs.GPBSET.bit.GPIO61 = 1; // 默认发送模式
// SCIB参数配置
ScibRegs.SCICCR.all = 0x0007; // 8位数据,1停止位,无校验
ScibRegs.SCICTL1.all = 0x0003; // 启用发送/接收
ScibRegs.SCICTL2.bit.TXINTENA = 1; // 发送中断使能
ScibRegs.SCICTL2.bit.RXBKINTENA = 1; // 接收中断使能
ScibRegs.SCBRR = 37500000/(16*baud)-1; // 波特率设置(如9600bps)
EDIS;
}
// RS485发送函数
void RS485_SendData(Uint8 *data, Uint16 len) {
GpioDataRegs.GPBCLR.bit.GPIO61 = 1; // 切换到发送模式
DELAY_US(10); // 等待收发器稳定
for(Uint16 i=0; i<len; i++) {
while(ScibRegs.SCICTL2.bit.TXEMPTY == 0); // 等待发送缓冲区空
ScibRegs.SCITXBUF = data[i]; // 写入发送缓冲区
}
while(ScibRegs.SCICTL2.bit.TXEMPTY == 0); // 等待最后字节发送完成
GpioDataRegs.GPBSET.bit.GPIO61 = 0; // 切换回接收模式
}
2. AD采样模块
// ADC初始化
void ADC_Init() {
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // 使能ADC时钟
// 时钟配置(12.5MHz)
AdcRegs.ADCTRL3.bit.ADCCLKPS = 3; // 分频系数=8
AdcRegs.HISPCP.bit.HSPCLK = 0; // HSPCLK=SYSCLKOUT/2
// 采样时间配置(20个时钟周期)
AdcRegs.ADCTRL1.bit.ACQ_PS = 0xF;
AdcRegs.ADCTRL1.bit.CPS = 0; // 不分频
// 通道配置(SEQ1扫描通道0-7)
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; // 通道0
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 1; // 通道1
// ... 配置其他通道
// 触发源配置(软件触发)
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; // 启动SEQ1
EDIS;
}
// AD采样中断服务函数
interrupt void ADC_ISR() {
static Uint16 adc_buffer[16];
static Uint16 index = 0;
// 读取SEQ1结果
adc_buffer[index++] = AdcRegs.ADCRESULT0 >> 4; // 通道0
if(index >= 16) {
index = 0;
// 发送数据到PC
RS485_SendData((Uint8*)adc_buffer, 32); // 16通道×2字节
}
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // 清除中断标志
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 清除中断请求
}
四、系统集成方案
1. 主程序流程
void main() {
// 系统初始化
InitSysCtrl();
InitPieCtrl();
DINT;
IER = 0x0000;
IFR = 0x0000;
// 外设初始化
RS485_Init(9600); // 初始化RS485
ADC_Init(); // 初始化ADC
InitPieVectTable(); // 初始化中断向量表
// 注册中断服务函数
PieVectTable.ADCINT1 = &ADC_ISR;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // 使能ADC中断
EINT; // 开启全局中断
while(1) {
// 主循环处理其他任务
DELAY_MS(10);
}
}
2. 数据帧协议设计
| 起始符 | 地址 | 长度 | 数据... | 校验 | 结束符 |
|---|---|---|---|---|---|
| 0xAA | 0x01 | 0x10 | ... | CRC | 0x55 |
五、关键调试技巧
-
RS485通信调试
-
使用逻辑分析仪捕获差分信号(A/B线)
-
验证收发模式切换时序(DE/RE引脚变化需<1μs)
-
检查终端电阻匹配(120Ω±1%)
-
-
ADC精度验证
-
使用标准电压源测试转换精度
-
检查采样保持时间是否足够(公式:ts ≥ 5×Rs×Cs)
-
通过软件校准消除零点漂移
-
六、性能优化
-
DMA传输加速
// 配置DMA0传输ADC结果 DMA0Regs.DMAQNUM.bit.DMAQ0 = 0; // 队列0 DMA0Regs.DMAAR = (Uint32)adc_buffer; // 源地址 DMA0Regs.DMADST = (Uint32)tx_buffer; // 目标地址 DMA0Regs.DMACTL.bit.EN = 1; // 启动DMA -
双缓冲机制
// 双缓冲切换逻辑 static Uint16 buffer[2][16] = {0}; static Uint8 cur_buffer = 0; // 中断中写入当前缓冲区 buffer[cur_buffer][index++] = adc_value; if(index >= 16) { cur_buffer ^= 1; // 切换缓冲区 index = 0; // 触发RS485发送 RS485_SendData((Uint8*)buffer[cur_buffer^1], 32); }
七、典型应用场景
-
工业监控系统
-
实时采集温度/压力传感器数据
-
通过RS485上传至PLC或上位机
-
-
智能仪表开发
-
实现多路参数测量(电压/电流/功率)
-
支持Modbus RTU协议通信
-
参考代码 基于DSP28335的RS485串口通讯与AD采样开发程序 www.youwenfan.com/contentcnp/115825.html
八、调试工具推荐
-
硬件工具
-
USB转RS485转换器(如MAX232芯片)
-
示波器(观察A/B线差分信号)
-
-
软件工具
-
Code Composer Studio(CCS)调试环境
-
逻辑分析仪(如Saleae)
-
该方案已在电机控制系统中验证,实现以下性能指标:
-
AD采样率:12.5kSPS(16通道轮询)
-
RS485通信速率:115200bps
-
系统延迟:<5ms(从采样到数据上传)
建议根据实际需求调整ADC采样率和RS485波特率,复杂场景可增加CRC校验和重传机制。

浙公网安备 33010602011771号