因为软件模拟的方式,io翻转和条件判断时间过长,不能满足归零码的时序,只能采用DMA+SPI硬件传输的方式。

SPI配置,因为只使用mosi模拟单极性归零码,所以直接把SPI的4个脚直接配置成复用模式,nss配置为soft或hard都能用,没有影响

注意LF配置(.endian),endian为MSB(高位先发)。因为归零码要求低电平复位,因此可在发送数组中多加一位,固定发0x00,空闲时就是低电平了。

void SPI0_config()
{spi_parameter_struct spi_init_struct;rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_SPI1);//端口直接配置为复用模式,GPIO_PUPD_PULLDOWN或GPIO_PUPD_NONE没区别gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLDOWN,GPIO_PIN_12 | GPIO_PIN_13 |         GPIO_PIN_14 | GPIO_PIN_15);gpio_af_set(GPIOB, GPIO_AF_0,GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);spi_init_struct.trans_mode = SPI_TRANSMODE_BDTRANSMIT;//SPI_TRANSMODE_FULLDUPLEX;//spi_init_struct.device_mode          = SPI_MASTER;spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;spi_init_struct.nss                  = SPI_NSS_SOFT;//SPI_NSS_HARD;//spi_init_struct.prescale             = SPI_PSC_8;spi_init_struct.endian               = SPI_ENDIAN_MSB;       spi_init(SPI1, &spi_init_struct);spi_dma_enable(SPI1,SPI_DMA_TRANSMIT);  //发送使用dmaspi_crc_polynomial_set(SPI1, 7);spi_enable(SPI1);
}

DMA配置,配置结束不急着开启

void SPI_DMA_config(void)
{
    dma_parameter_struct dma_init_struct;
    rcu_periph_clock_enable(RCU_DMA);
    dma_struct_para_init(&dma_init_struct);

dma_deinit(DMA_CH4);
    dma_struct_para_init(&dma_init_struct);
    dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
    dma_init_struct.memory_addr = (uint32_t)sendbuff;
    dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;        //内存递增
    dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;

dma_init_struct.number = RGB_SEND_SIZE;
    dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI1);                //注意&符号
    dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;        //外设不递增
    dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
    dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
    dma_init(DMA_CH4, &dma_init_struct);
    dma_memory_to_memory_disable(DMA_CH4);
    dma_circulation_disable(DMA_CH4);
    dma_interrupt_disable(DMA_CH4, DMA_INT_FTF); 
//    dma_channel_enable(DMA_CH4);                      //使能关闭,发送前开启
}

发送流程,DMA启动SPI发送的流程为,先配置好SPI(只需要一次),再配置好DMA(每次发送前都要配置,配置好自动发送)就可以了。

其实每次DMA启动只需要部分配置参数,这里为了省事直接调用初始化配置函数。

void spi_dma_send(void)
{
    dma_channel_disable(DMA_CH4);
    SPI_DMA_config();
    dma_channel_enable(DMA_CH4);
    while(RESET == dma_flag_get(DMA_CH4,DMA_FLAG_FTF));
}

发送前将数据更新到DMA配置的内存地址中就OK了。

memcpy(sendbuff,sendbuff,SEND_SIZE);      //第一个sendbuff是全局变量,第二个是局部变量
spi_dma_send();

模拟归零码的原理就是,调整SPI周期,使得SPI传输8个字节的时间约等于归零码一个高-低电平周期的时间,这样控制SPI发送的1个字节的数据,相当于传输归零码1位的数据。下面是SPI总线42Mhz,8分频之后归零码0、1对应的spi字节宏定义,SPI发送1位数据大约0.2us,要求严格的话,也可以配置成4分频,采用16字节数据传输,根据需求合理配置。

#define lowbit 0x80
#define highbit 0xf8

记录单极性归零码控制LED,GD32F330+SPI+DMA方式相关推荐

  1. 双极性归零码 matlab,双极性不归零码的Matlab实现

    %双极性不归零码 %时间单位 us 频率单位 MHz 码元速率 Mb/s close all %关闭所有的窗口 clear all %清除所有的变量 k=14; N=2^k;  %总采样点数 L=25 ...

  2. matlab极性rz编码,单极性归零(RZ)波形及其Matlab仿真.doc

    单极性归零(RZ)波形及其Matlab仿真 单极性归零(RZ)波形及其 1. 仿真原理及思路 功率信号的平均功率:.该信号的双边功率谱密度为:,其中是截短后的傅氏变换,是的能量谱,是在截短时间内的功率 ...

  3. matlab极性rz编码,单极性归零(RZ)波形及其Matlab仿真

    单极性归零(RZ )波形及其仿真 1. 仿真原理及思路 功率信号f (t)的平均功率: ()T f T T T P P(f )df lim f t dt ∞ +-∞ -→∞ ==?? 2 12.该信号 ...

  4. 单极性归零NRZ码、双极性非归零NRZ码、2ASK、2FSK、2PSK、2DPSK及MATLAB仿真

    二进制调制团圆饭 源代码 仿真结果 源代码 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 单极性归零NRZ码.双极性非归零NRZ码.2ASK.2FSK.2P ...

  5. 用定时器T0查询方式P0口8位控制LED闪烁 T1查询方式P1口8位控制LED闪烁

    //用定时器T0查询方式P0口8位控制LED闪烁 T1查询方式P1口8位控制LED闪烁 #include<reg52.h>        //  包含52单片机寄存器定义的头文件 #def ...

  6. 简单实验用三极管制作单按键开关来控制LED

    1.准备实验原件 原件 说明 8550三极管(可以常用其他型号) 1个 10k电阻 3个 1k电阻 1个 1m电阻 1个 0.1uF(104)电容 1个 按钮 2个 电源 - 面包板 - 导线 - L ...

  7. IO控制器 IO控制方式(程序直接控制、中断驱动、DMA方式、通道控制方式)

    DMA方式 解决中断驱动方式必须经过CPU的问题.每次只读/写一个字问题 一个通道可以控制多个IO控制器,一个IO控制器可以控制多个设备.

  8. HTML自适应情侣纪念日记录单页源码

    正文: 以下是作者原话: 使用方法: 大部分内容都在index.html里面进行修改 "在一起"的时间修改在./js/lovetime.js里,已进行代码备注 首页标题修改在./j ...

  9. 【数字基带信号】基于matlab实现单双极归零码和功率谱仿真

    1 简介 数字基带信号是通信系统中最基本的信号之一,为了更好地学习和掌握该类信号,利用MATLAB软件从单双极性归零编码和不归零编码两个角度对其展开研究,并且求各自的功率谱密度. 2 部分代码 clo ...

最新文章

  1. Android Studio 3.5 Canary 12 发布
  2. 80个Python经典资料(教程+源码+工具)汇总——下载目录
  3. 10061 mysql,Navicat无法连接到MySQL server的10061错误
  4. html5网页仿写,纯CSS代码模仿绘制蚂蚁庄园页面
  5. Ubuntu16.04安装Pycharm2017.2
  6. 【ACM】杭电1141:Factstone Benchmark
  7. 【Ubuntu 16】源码包安装Apache Httpd
  8. 解决VisualStudio 05/08智能提示显示1秒钟
  9. Android-基本控件和详解四种布局方式
  10. oracle数据库sga用途_oracle数据库的SGA和PGA,及分配指导
  11. Java IO之打印流,缓冲流,Scanner的用法
  12. 象牙大钢琴II压缩版-Synthogy Ivory by JR Samples II Kontakt
  13. Verilog -- 乘法器Booth算法
  14. 安卓按键命令库教程(紫猫版续)
  15. shell 亚瑟王环
  16. 安卓手机屏幕共享给电脑操作的几款软件
  17. oracle em错误,em使用错误,求建议
  18. UWA发布 | 2017 Unity手游体检蓝皮书 — MMORPG篇
  19. cvs配电保护断路器_CVS100F断路器|施耐德CVS100F100A断路器
  20. 娶妻要娶贤妻,不是美女

热门文章

  1. 漫画:为什么程序员没有女朋友?
  2. 2012最新个税税率表及速算扣除数
  3. 生活篇之工资和年终奖的纳税
  4. position的absolute属性
  5. Day1、为什么JDK1.8中HashMap从头插入改成尾插入
  6. 房屋出租系统(初级)
  7. 一种简单的方法让华为手机和windows10共享文件
  8. WebSocket和socket介绍
  9. java.io.FileNotFoundException: D:\hadoop (拒绝访问。)
  10. Python3导入scrapy报错1 in C:\Users\ADMINI~1\AppData\Local\Temp\pip-install-831gxniz\Twisted\