一、硬件连接与配置
-
硬件接口定义
DSP28335引脚 ESP8266引脚 功能说明 SCITXDA RX DSP发送数据到ESP8266 SCIRXDA TX ESP8266发送数据到DSP GND GND 共地 VCC 3.3V 供电(需电平转换芯片) -
关键配置参数
- 系统时钟:假设SYSCLKOUT=150MHz,SCI时钟源选择LSPCLK=150MHz/4=37.5MHz
- 波特率 :9600bps(通过公式
BRR = (LSPCLK / (波特率×8)) - 1计算得BRR=1952,即0x0798) - 数据格式:8位数据位 + 1位停止位 + 无校验
二、DSP28335 SCI模块初始化
c
// SCI-A初始化函数
void SCI_Init() {
EALLOW;
// 1. 使能SCI时钟
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;
// 2. 配置GPIO为SCI功能
GpioCtrlRegs.GPBMUX2.bit.GPIO62 = 1; // SCIRXDA → GPIO62
GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 1; // SCITXDA → GPIO63
GpioCtrlRegs.GPBPUD.bit.GPIO62 = 0; // 启用上拉
GpioCtrlRegs.GPBPUD.bit.GPIO63 = 0; // 启用上拉
// 3. 设置SCI参数
SciaRegs.SCICCR.all = 0x0007; // 1停止位,无校验,8位数据
SciaRegs.SCICTL1.all = 0x0003; // 使能发送/接收
SciaRegs.SCICTL2.all = 0x0003; // 使能发送/接收中断
// 4. 配置波特率
SciaRegs.SCIHBAUD = 0x07; // 高8位:0x0798 → 0x07
SciaRegs.SCILBAUD = 0x98; // 低8位:0x0798 → 0x98
// 5. FIFO配置(可选)
SciaRegs.SCIFFTX.all = 0x8040; // 启用FIFO,深度16,触发阈值8
SciaRegs.SCIFFRX.all = 0x204F; // 接收FIFO深度16,触发阈值8
EDIS;
}
三、ESP8266 AT指令控制流程
-
模块复位与模式设置
cvoid ESP8266_Init() { UART_SendString("AT+RST\r\n"); // 复位模块 Delay_ms(1000); UART_SendString("AT+CWMODE=1\r\n");// 设置STA模式 Delay_ms(500); UART_SendString("AT+CWJAP=\"WIFI_SSID\",\"WIFI_PASSWORD\"\r\n");// 连接WiFi Delay_ms(3000); } -
TCP连接建立
cvoid ESP8266_ConnectTCP() { UART_SendString("AT+CIPMUX=0\r\n"); // 单连接模式 Delay_ms(500); UART_SendString("AT+CIPSTART=\"TCP\",\"192.168.1.100\",8080\r\n");// 连接服务器 Delay_ms(3000); } -
数据发送
cvoid ESP8266_SendData(char *data) { char cmd[50]; sprintf(cmd, "AT+CIPSEND=%d\r\n", strlen(data)); UART_SendString(cmd); Delay_ms(500); UART_SendString(data); // 发送实际数据 }
四、SCI中断服务程序
c
// 发送中断服务程序
interrupt void SCI_TX_ISR() {
static Uint16 txIndex = 0;
if (SciaRegs.SCIFFTX.bit.TXFFST != 0) {
SciaRegs.SCITXBUF = txBuffer[txIndex++]; // 从FIFO取数据发送
if (txIndex >= BUFFER_SIZE) {
SciaRegs.SCICTL2.bit.TXINTENA = 0; // 发送完成禁用中断
}
}
PieCtrlRegs.PIEACK.all |= 0x0100; // 清除中断标志
}
// 接收中断服务程序
interrupt void SCI_RX_ISR() {
Uint16 rxData = SciaRegs.SCIRXBUF.all; // 读取接收数据
UART_ProcessData(rxData); // 处理接收到的AT响应
SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1; // 清除接收溢出标志
PieCtrlRegs.PIEACK.all |= 0x0100; // 清除中断标志
}
五、关键问题解决方案
-
波特率不匹配
-
现象:ESP8266返回乱码
-
解决 :通过示波器测量实际波特率,调整
BRR值。例如,若实际波特率为115200:cSciaRegs.SCIHBAUD = 0x00; // 115200bps → BRR=(150e6/(8 * 115200))-1=15 SciaRegs.SCILBAUD = 0x0F;
-
-
数据包丢失
-
优化方案:
- 启用SCI FIFO并设置触发阈值(如8字节)
- 增加接收缓冲区(环形缓冲区)
c#define RX_BUFFER_SIZE 128 Uint16 rxBuffer[RX_BUFFER_SIZE]; volatile Uint16 rxWritePos = 0, rxReadPos = 0;
-
-
ESP8266响应超时
-
代码实现:
c#define TIMEOUT_MS 1000 Uint16 CheckResponse(char *expected) { Uint32 startTime = Timer_GetCount(); while ((Timer_GetCount() - startTime) < TIMEOUT_MS) { if (strstr(rxBuffer, expected)) return 1; } return 0; }
-
参考代码 利用dsp28335的sci模块对esp8266wifi模块进行控制 www.youwenfan.com/contentcsq/69284.html
六、完整测试流程
-
硬件连接验证
- 使用USB转TTL模块单独测试ESP8266的AT指令响应
- 确认DSP与ESP8266的TX/RX交叉连接正确
-
功能测试
测试项 预期结果 验证方法 SCI自收发测试 发送"Hello"接收相同数据 通过逻辑分析仪捕获数据 ESP8266连接WiFi 返回"OK" 串口助手监控 TCP数据透传 服务器收到发送内容 网络抓包工具验证 -
压力测试
- 连续发送1000条数据,统计丢包率
- 高负载下监测SCI FIFO状态
七、扩展应用场景
- 物联网数据采集
- 通过ESP8266上传DSP处理的传感器数据至云平台
- 远程固件升级
- 使用ESP8266的HTTP功能下载新固件并烧写
- 多节点组网
- 配置ESP8266为AP模式,实现DSP与多个终端通信
八、调试工具推荐
- 串口助手:用于发送AT指令和查看原始数据
- 逻辑分析仪:捕获SCI通信波形(如Saleae)
- Wireshark:分析TCP/IP数据包