最近一段时间刚开始接触单片机领域 想用spi+dma来批量接收麦克风的pdm数据, 基本就是给麦克风一个信号 麦克风返回一个数字的采样信号. 文档里的信息不多 但是按我理解这样设置后spi应该会自动开始发送clk信号并等待来自miso的输入. 但是烧录之后clk一直维持低电平没有输出时钟.
已经排除电气连接的问题, 并用不带dma的spi功能进行了发送测试. 顺便我不太明白在不带dma的情况下要怎么直接一直输出clk, spi似乎只有在缓冲区里有数据时才发送clk同时从mosi输出
- #include <stdio.h>
- #include <stc8h.h>
- #include <intrins.h>
-
- #define ADDH(x) (((unsigned char *)&x)[0])
- #define ADDL(x) (((unsigned char *)&x)[1])
-
- char xdata dma_buf[20];
-
- void main()
- {
- // 允许写入特殊功能寄存器
- // 即高128位xfr寄存器
- P_SW2 |= 0x80;
-
- // 设置gpio输出模式
- P3M0 = 0;
- P3M1 = 0;
- P5M0 = 0;
- P5M1 = 0;
- P2M0 = 0;
- P2M1 = 0;
- P1M0 = 0;
- P1M1 = 0;
-
- // 设置hric-mclk频率为27mhz
- // 设置分频系数为3, sysclk=27/3=9mhz
- CLKDIV = 3;
-
- // 初始化spi
-
- // 设置spi功能脚
- // cs P35
- // mosi P34
- // miso P33
- // clk P32
- P_SW1 |= 12;
-
- // 配置spi
- SPCTL = 0;
- SPCTL |= 1 << 7; // 忽略cs脚
- SPCTL |= 1 << 6; // spi使能
- // 控制发送/接收大小端
- SPCTL |= 1 << 4; // 主机模式
-
- // 清除spi状态
- SPSTAT = 0xc0;
-
- // DMA初始化
- // 禁止中断
- // 仅启用rx
- // 00100000
- DMA_SPI_CFG = 0x20;
-
- // 启用spi dma
- // 主机模式
- // 复位FIFO
- DMA_SPI_CR = 0xC1;
- DMA_SPI_STA = 1;
- DMA_SPI_AMT = 100;
-
- // 设置接收缓冲区地址
- DMA_SPI_RXAH = ADDH(dma_buf);
- DMA_SPI_RXAL = ADDL(dma_buf);
-
- // 主循环
- while(1)
- {
- // 只是测试一下有无时钟信号, 故总是丢弃所有接收到的数据
- DMA_SPI_STA = 0;
- _nop_();
- }
- }
复制代码
不太清楚是不是该发这个板块今天刚注册 |