1、前言

本文使用AT32F425驱动RC522来测试SPI1的速率,关于RC522的详细代码操作可查帖子【GD32L233C-START】硬件SPI1驱动RC522。

2、关于AT32F425的SPI


AT32F425系列最多有3个spi,本文使用SPI1。

3、SPI1的最大速率


SPI1挂在APB2总线上,APB2总线的最大速率是96MHz;
SPI的最大速率为fPCLK/2,即48Mhz。

4、代码实现

/*SPI1 :  PA4/CS  PA5/SCK    PA6/MISO   PA7/MOSI
*/

(1)模拟SPI

#define SET_SPI_CS()  gpio_bits_set(GPIOA, GPIO_PINS_4)
#define CLR_SPI_CS() gpio_bits_reset(GPIOA, GPIO_PINS_4) #define SET_SPI_SCLK() gpio_bits_set(GPIOA,GPIO_PINS_5)
#define CLR_SPI_SCLK() gpio_bits_reset(GPIOA,GPIO_PINS_5)//SCL=SCLK#define SET_SPI_MOSI() gpio_bits_set(GPIOA,GPIO_PINS_7)
#define CLR_SPI_MOSI() gpio_bits_reset(GPIOA,GPIO_PINS_7)//SDO=MOSI#define READ_SPI_MISO() gpio_input_data_bit_read(GPIOA,GPIO_PINS_6) //SDI=MISOvoid SpiIoInit(void)
{   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);gpio_init_type gpio_initstructure;/* configure the lcd gpio */gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;gpio_initstructure.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;gpio_initstructure.gpio_pins = GPIO_PINS_4|GPIO_PINS_5|GPIO_PINS_7;gpio_initstructure.gpio_pull = GPIO_PULL_NONE;gpio_init(GPIOA, &gpio_initstructure);gpio_bits_set(GPIOA,GPIO_PINS_4|GPIO_PINS_5|GPIO_PINS_7);gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;gpio_initstructure.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;gpio_initstructure.gpio_mode = GPIO_MODE_INPUT;gpio_initstructure.gpio_pins = GPIO_PINS_6;gpio_initstructure.gpio_pull = GPIO_PULL_NONE;gpio_init(GPIOA, &gpio_initstructure);gpio_bits_set(GPIOA,GPIO_PINS_6);}uint8_t  SPIWriteByte(uint8_t dat)
{uint16_t ret=0;u8 i;CLR_SPI_CS();for(i=0;i<8;i++){            if(dat&0x80){SET_SPI_MOSI();}else{CLR_SPI_MOSI();}dat<<=1;
//      delay_us(1);SET_SPI_SCLK();ret<<=1;if(READ_SPI_MISO()){ret+=1;}
//      delay_us(1);CLR_SPI_SCLK();}SET_SPI_CS();return (ret&0x0ff);
}

(2)硬件SPI

void SpiIoInit(void)
{   gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;gpio_initstructure.gpio_pull           = GPIO_PULL_UP;gpio_initstructure.gpio_mode           = GPIO_MODE_OUTPUT;gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;gpio_initstructure.gpio_pins = GPIO_PINS_4;gpio_init(GPIOA, &gpio_initstructure);gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE5, GPIO_MUX_0);gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE6, GPIO_MUX_0);gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_0);gpio_default_para_init(&gpio_initstructure);gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;gpio_initstructure.gpio_pull           = GPIO_PULL_DOWN;gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;gpio_initstructure.gpio_pins = GPIO_PINS_5;gpio_init(GPIOA, &gpio_initstructure);gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;gpio_initstructure.gpio_pull           = GPIO_PULL_UP;gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;gpio_initstructure.gpio_pins = GPIO_PINS_6;gpio_init(GPIOA, &gpio_initstructure);gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;gpio_initstructure.gpio_pull           = GPIO_PULL_UP;gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;gpio_initstructure.gpio_pins = GPIO_PINS_7;gpio_init(GPIOA, &gpio_initstructure);spi_init_type spi_init_struct;crm_periph_clock_enable(CRM_SPI1_PERIPH_CLOCK, TRUE);spi_default_para_init(&spi_init_struct);spi_init_struct.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;spi_init_struct.master_slave_mode = SPI_MODE_MASTER;spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_8;spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_LOW;spi_init_struct.clock_phase = SPI_CLOCK_PHASE_1EDGE;spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;spi_init(SPI1, &spi_init_struct);spi_enable(SPI1, TRUE);
}uint8_t  SPIWriteByte(uint8_t dat)
{uint16_t ret=0;CLR_SPI_CS();while(spi_i2s_flag_get(SPI1, SPI_I2S_TDBE_FLAG) == RESET) {};spi_i2s_data_transmit(SPI1, dat);while(spi_i2s_flag_get(SPI1, SPI_I2S_RDBF_FLAG) == RESET) {};ret=spi_i2s_data_receive(SPI1);SET_SPI_CS();      return (ret&0x0ff);
}

使用硬件SPI测试时,RC522的最大速率只能到12MHZ,也就是8分频,速率再大会导致通信不上。

5、速率测量

这里直接用示波器抓CLK的波形,用逻辑分析抓整个SPI的波形。

(1)模拟SPI


可以看出,使用模拟SPI的时候是1.8MHz,用逻辑分析仪抓取也是这个结果。

(2)硬件SPI


可以看出,使用硬件SPI的时候是12MHz,与软件设定的一致,用逻辑分析仪抓取也是这个结果。

综合对比测量,可以发现,硬件SPI速率远大于软件SPI,因此为了提高cpu的利用率,应尽量选择使用硬件SPI。

硬件SPI与软件模拟SPI速率对比相关推荐

  1. 关于stm32通信协议:软件模拟SPI、软件模拟I2C的总结(fishing_8)

    趁着帮老师代上嵌入式实验课的机会,又重新熟悉了一遍stm32的通信协议:串口协议.SPI协议.I2C协议.RS485协议.大概半年前,是过了一遍的,但也只停留于读了遍代码,跑了下例程,最近又过了一遍( ...

  2. 单片机软件模拟SPI接口—加深理解SPI总线协议

    单片机软件模拟SPI接口-加深理解SPI总线协议   SPI(Serial Peripheral Interfacer 串行外设接口)是摩托罗拉公司推出的一种同步串行通讯接口,用于微处理器臌控制器和外 ...

  3. 一文搞懂——软件模拟SPI

    关于stm32通信协议:软件模拟SPI.软件模拟I2C的总结(fishing_8)_To_be_a_fisher的博客-CSDN博客_stm32 软件spi 发现一篇写的软件模拟SPI的比较容易理解的 ...

  4. MAX31855电路和程序,实现SPI和软件模拟时序两种方式读取数据

    1. 概述 MAX31855为热电偶至数字输出转换器,内置14位模/数转换器(ADC).器件带有冷端补偿检测和修正.数字控制器.SPI兼容接口,以及相关的控制逻辑,在温度控制器.过程控制或监测系统中设 ...

  5. 【STM32】0.96寸OLED显示屏(7针SPI协议)软件模拟SPI

    Author:AXYZdong 自动化专业 工科男 有一点思考,有一点想法,有一点理性 [自制展示]2020鼠年大吉 文章目录 概述 3.1硬件设计 3.2软件设计 3.2.1编程要点 3.2.2代码 ...

  6. STM32F103软件模拟SPI接口驱动ILI9486液晶屏

    STM32F103软件模拟SPI接口驱动ILI9486液晶屏 ILI9486的工作模式 ILI9486的SPI总线方式简介 ILI9486的3线SPI总线底层驱动配置步骤 ILI9486的工作模式 I ...

  7. 软件模拟SPI时序实现25Q64读写操作

    软件模拟SPI时序实现25Q64读写操作 单片机采用SPI/IIC通讯协议访问外围电子模块如:显示屏.EEPROM.FLASH.各种电子传感器等等越来越多,掌握SPI/IIC通讯协议访问外设非常必要. ...

  8. java如何编写spi接口_软件模拟SPI接口程序代码(4种模式)

    软件模拟SPI接口程序代码(4种模式) SPI协议简介 SPI的通信原理很简单,一般主从方式工作,这种模式通常有一个主设备和一个或多个从设备,通常采用的是4根线,它们是MISO(数据输入,针对主机来说 ...

  9. 软件模拟SPI接口程序代码(4种模式)

    软件模拟SPI接口程序代码(4种模式) SPI协议简介 SPI的通信原理很简单,一般主从方式工作,这种模式通常有一个主设备和一个或多个从设备,通常采用的是4根线,它们是MISO(数据输入,针对主机来说 ...

最新文章

  1. js获取过滤条件中参数的快捷方式
  2. 将SVN的代码推送到码云的步骤
  3. HDU-1274 展开字符串
  4. chapter2.3、react高阶组件,装饰器
  5. scala入门-01-IDEA安装scala插件
  6. 非安装版的PostgreSQL8.3.3的首次使用经历
  7. 英语四级真题作文 计算机,英语四级作文 Computers-计算机_2000字_英语作文
  8. 十 全局结果页面的配置
  9. ffmpeg推流和拉流rtsp
  10. word2016 图片去底灰_打印图片怎样去灰色底
  11. SQL数据库置疑恢复
  12. 找网络高手联系方式_怎么才能联系到网络高手(找网络大牛联系方式)
  13. 圆柱体积怎么算立方公式_圆柱体积公式怎么算
  14. 马赛克战——利用人工智能和自主系统来实施决策中心作战
  15. 谈谈对java线程的理解(五)--------ReentrantLock之阻塞队列
  16. 【Day5.7】美食街实在吃不下去,回暹罗商圈再晚餐
  17. 格斗类游戏的键盘处理
  18. AMESim锂离子电池包电化学机理模型
  19. Java微服务面试题整理
  20. sfsdfsdffsdf

热门文章

  1. 数据治理解决方案 PPT
  2. 微信公众号H5页面实现扫一扫功能
  3. sumatrapdf关闭当前tab快捷键
  4. 织梦dedecms手机上,自动跳转到/m目录mobile手机版h5页面
  5. python和按键精灵自动化测试_高级版按键精灵,同时也是UI自动化测试的好帮手 - SIKULI...
  6. .关机助手,很好用的Windows桌面关机小工具(免费版)
  7. uuid_broadcast用法
  8. H.264远程视频监控系统
  9. python小游戏——Crazy Eights(纸牌游戏)
  10. 信息学奥赛一本通 1209:分数求和 | OpenJudge NOI 1.13 12:分数求和