找回密码
 立即注册
查看: 309|回复: 5

开启DMA希望SPI自动接收数据但是CLK没有输出

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-05-20 11:42:07
已绑定手机

3

主题

13

回帖

97

积分

注册会员

积分
97
发表于 2025-1-25 23:04:24 | 显示全部楼层 |阅读模式
最近一段时间刚开始接触单片机领域 想用spi+dma来批量接收麦克风的pdm数据, 基本就是给麦克风一个信号 麦克风返回一个数字的采样信号. 文档里的信息不多 但是按我理解这样设置后spi应该会自动开始发送clk信号并等待来自miso的输入. 但是烧录之后clk一直维持低电平没有输出时钟.
已经排除电气连接的问题, 并用不带dma的spi功能进行了发送测试. 顺便我不太明白在不带dma的情况下要怎么直接一直输出clk, spi似乎只有在缓冲区里有数据时才发送clk同时从mosi输出
  1. #include <stdio.h>
  2. #include <stc8h.h>
  3. #include <intrins.h>
  4. #define ADDH(x)  (((unsigned char *)&x)[0])
  5. #define ADDL(x)  (((unsigned char *)&x)[1])
  6. char xdata dma_buf[20];
  7. void main()
  8. {       
  9.         // 允许写入特殊功能寄存器
  10.         // 即高128位xfr寄存器
  11.         P_SW2 |= 0x80;
  12.        
  13.         // 设置gpio输出模式
  14.         P3M0 = 0;
  15.         P3M1 = 0;
  16.         P5M0 = 0;
  17.         P5M1 = 0;
  18.         P2M0 = 0;
  19.         P2M1 = 0;
  20.         P1M0 = 0;
  21.         P1M1 = 0;
  22.        
  23.         // 设置hric-mclk频率为27mhz
  24.         // 设置分频系数为3, sysclk=27/3=9mhz
  25.         CLKDIV = 3;
  26.         // 初始化spi
  27.        
  28.         // 设置spi功能脚
  29.         // cs        P35
  30.         // mosi        P34
  31.         // miso        P33
  32.         // clk        P32
  33.         P_SW1 |= 12;
  34.        
  35.         // 配置spi
  36.         SPCTL = 0;
  37.         SPCTL |= 1 << 7; // 忽略cs脚
  38.         SPCTL |= 1 << 6; // spi使能
  39.         // 控制发送/接收大小端
  40.         SPCTL |= 1 << 4; // 主机模式
  41.        
  42.         // 清除spi状态
  43.         SPSTAT = 0xc0;
  44.        
  45.         // DMA初始化
  46.         // 禁止中断
  47.         // 仅启用rx
  48.         // 00100000
  49.         DMA_SPI_CFG = 0x20;
  50.        
  51.         // 启用spi dma
  52.         // 主机模式
  53.         // 复位FIFO
  54.         DMA_SPI_CR = 0xC1;
  55.         DMA_SPI_STA = 1;
  56.         DMA_SPI_AMT = 100;
  57.        
  58.         // 设置接收缓冲区地址
  59.         DMA_SPI_RXAH = ADDH(dma_buf);
  60.         DMA_SPI_RXAL = ADDL(dma_buf);
  61.        
  62.         // 主循环
  63.         while(1)
  64.         {
  65.                 // 只是测试一下有无时钟信号, 故总是丢弃所有接收到的数据
  66.                 DMA_SPI_STA = 0;
  67.                 _nop_();
  68.         }
  69. }
复制代码




不太清楚是不是该发这个板块今天刚注册
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-05-20 11:42:07
已绑定手机

3

主题

13

回帖

97

积分

注册会员

积分
97
发表于 2025-1-25 23:07:37 | 显示全部楼层
硬件是stc8H8K64U 启用usb仿真 逻辑分析仪在spi发送测试时能正常检测到mosi和clk输出

点评

spi是全双工,一直发00就可以拿到接受数据了  详情 回复 发表于 2025-1-25 23:56
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:499
  • 最近打卡:2025-06-16 10:06:31
已绑定手机
已实名认证

112

主题

2391

回帖

6016

积分

版主

积分
6016
发表于 2025-1-25 23:56:33 | 显示全部楼层
ura*** 发表于 2025-1-25 23:07
硬件是stc8H8K64U 启用usb仿真 逻辑分析仪在spi发送测试时能正常检测到mosi和clk输出 ...

spi是全双工,一直发 FFH 就可以拿到接受数据了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-05-20 11:42:07
已绑定手机

3

主题

13

回帖

97

积分

注册会员

积分
97
发表于 2025-1-26 09:44:01 | 显示全部楼层
王*** 发表于 2025-1-25 23:56
spi是全双工,一直发00就可以拿到接受数据了

谢谢 我禁用了dma尝试手动发0试了一下
  1.         SPSTAT |= 0xC0;
  2.        
  3.         // DMA初始化
  4.         // 10100101
  5.         // DMA_SPI_CFG = 0x20;
  6.        
  7.         // DMA_SPI_CR = 0xC1;
  8.         // DMA_SPI_STA = 1;
  9.         // DMA_SPI_AMT = 100;
  10.        
  11.         // 设置缓冲区地址
  12.         // DMA_SPI_RXAH = ADDH(dma_buf);
  13.         // DMA_SPI_RXAL = ADDL(dma_buf);
  14.        
  15.         // 主循环
  16.         while(1)
  17.         {
  18.                 SPSTAT |= 0xC0;
  19.                 SPDAT = 0;
  20.                
  21.                 while (SPSTAT != 0x80)
  22.                         _nop_();
  23.                
  24.                 // DMA_SPI_STA = 0;
  25.         }
复制代码


但是用逻辑分析仪看了一下 发送完一个字节后clk变为低电平, miso被重新拉高, 2us后才会继续发送下一个字节 spi时钟为2Mhz clk能连续发送吗? 还是这就是spi的特性?

点评

spi需要装载数据,clk就是会中断的,并不是完全的连续  详情 回复 发表于 2025-1-26 11:07
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:499
  • 最近打卡:2025-06-16 10:06:31
已绑定手机
已实名认证

112

主题

2391

回帖

6016

积分

版主

积分
6016
发表于 2025-1-26 11:07:25 | 显示全部楼层
ura*** 发表于 2025-1-26 09:44
谢谢 我禁用了dma尝试手动发0试了一下

spi需要装载数据,clk就是会中断的,并不是完全的连续
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-05-20 11:42:07
已绑定手机

3

主题

13

回帖

97

积分

注册会员

积分
97
发表于 2025-1-27 21:28:17 | 显示全部楼层
王*** 发表于 2025-1-26 11:07
spi需要装载数据,clk就是会中断的,并不是完全的连续

好的 谢谢. 我又研究了一下手册, 其实简单的计数器好像就能满足我的需求 对pdm脉冲信号进行计数 固定频率取一次再重置计数器 最后大概就能转为pcm信号. 这两天试一下
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-16 18:17 , Processed in 1.501477 second(s), 79 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表