IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32-FPGA_SPI -> 正文阅读

[嵌入式]STM32-FPGA_SPI

这里是单片机做主机,FPGA做从机

SPI_写(由单片机写入FPGA)

在此之前,先介绍基本的读写函数spi_wr_32bit_MSB_first(B1,B2,B3,B4) 和spi_wr_1bit_cmd_read_16bit()

  • 读时序(32位)

在这里插入图片描述

void spi_wr_32bit_MSB_first(unsigned char B3,unsigned char B2,unsigned char B1,unsigned char B0){
  int i = 0, j = 0;
  unsigned char byte4[4] = {0};
  unsigned char buf = 0;
  byte4[3] = B3; byte4[2] = B2; byte4[1] = B1; byte4[0] = B0;

  
  spi_wr_cs(1);
  spi_wr_sck(1);
  spi_wr_sda_out(1);
  // drop down cs
  spi_wr_cs(0);
  Delay(1);
  // drop down sck
  spi_wr_sck(0);
  Delay(1);
  // put data
  for(j = 0; j < 4; j ++){
    buf = byte4[3-j];
    for(i = 0; i < 8; i ++){
      spi_wr_sda_out((buf&0x80) >> 7);
      buf = buf << 1;
      Delay(1);
      spi_wr_sck(1);
      Delay(1);
      spi_wr_sck(0);
    }
  }
  spi_wr_cs(1);
  spi_wr_sck(1);
}
  • 写时序(16位)
    在这里插入图片描述
unsigned int spi_wr_1bit_cmd_read_16bit(){
  int i = 0;
  unsigned int rd_val = 0; unsigned char sda_in = 0;
  unsigned char buf = 0xaa;
  unsigned char rd16[16] = {0};
  spi_wr_cs(1);
  spi_wr_sck(1);
  spi_wr_sda_out(1);
  // drop down cs
  spi_wr_cs(0);
  Delay(1);
  // drop down sck
  spi_wr_sck(0);
  Delay(1);
  // write first data bit as 1
  spi_wr_sda_out(1);
  Delay(1);
  spi_wr_sck(1);
  Delay(1);
  spi_wr_sck(0);

  // read data
  for(i = 0; i < 16; i ++){
    spi_wr_sda_out(0);
    buf = buf << 1;
    Delay(1);
    spi_wr_sck(1);
    Delay(1);
    spi_wr_sck(0);
    // read sda in ,at sclk neg edge
    sda_in = spi_rd_sda_in();
    // printf("sda_in = %x \r\n",sda_in);
    rd_val = (rd_val << 1)| (sda_in&0x01);
    rd16[i] = sda_in;
  }
  spi_wr_cs(1);
  spi_wr_sck(1);
//  printf("rd_val = %x \r\n",rd_val);
#if 0 // bit print debug
  for(i = 0; i < 16; i ++){
    printf("rd16[%d] = %x \r\n",i, rd16[i]);
  }
#endif
  return rd_val;
}

写单个数据

写数据当然要先告诉地址,这里的FPGA会将spi_wr_32bit_MSB_first(B1,B2,B3,B4)的前两位当成地址,后两位当成写入的数据

**这表示分别往0x00000x0001写入了16位的数据**
    spi_wr_32bit_MSB_first(0x00, 0x00, 0x02, 0x02); // 16 bit counter 1
    spi_wr_32bit_MSB_first(0x00, 0x01, 0x01, 0x01); // 16 bit counter 2

写大量数据(如RAM)

void spi_wr_addr_7b_data_16b_ram_128(){
  int i = 0, wa = 0, wd = 0, wa_H, wa_L, wd_H, wd_L;
  // test case 1
  for (i = 0 ; i < 128; i ++){
    wa = i&(128-1); wa_H = (wa >> 8) & 0xff; wa_L = wa  & 0xff;
    wd = wa*255   ; wd_H = (wd >> 8) & 0xff; wd_L = wd  & 0xff;
    // ADDRESS MUST BE WRITE FIRST
    //                     A_H   A_L , D_H , D_L
    spi_wr_32bit_MSB_first(0x00, 0x00, wa_H, wa_L); // write wa reg 地址使能连接到总线选择器0x0000
    spi_wr_32bit_MSB_first(0x00, 0x01, wd_H, wd_L); // write wd reg 数据使能连接到0x0001
  } 
}
**这表示向128位的ram里写入了一组从028560,步进为255的递增的值

SPI读(从FPGA到单片机)

读数据之前需要先告知FPGA,应该把地址读到哪里去。所以读数据之前需要先写

读单个数据

写函数 先告知FPGA:单片机需要读取地址为0x0007(总线选择器)处的DIN0口数据
之后读函数 再将数据读出

    // before read, write the read select value  to mux first, select the mux input 0 to output
    spi_wr_32bit_MSB_first(0x00, 0x07, 0x00, 0x00); 
    // read the output value of the selected mux input port 0, a 16 bit counter  value 
    rd_val = spi_wr_1bit_cmd_read_16bit();

在这里插入图片描述

读大量数据

void spi_rd_addr_7b_data_8_rom_128(){
    unsigned int rom_addr = 0, rd_val = 0;
    // first write the read select value
    spi_wr_32bit_MSB_first(0x00, 0x07, 0x00, 0x01); 

****要读的ROM连在总线选择器(0x0007)的DIN1口(0x0001***********

    for(rom_addr = 0; rom_addr < 128; rom_addr ++){
      //  write the rom read address
      spi_wr_32bit_MSB_first(0x00, 0x08, 0x00, rom_addr&0xFF); 
      
****要读的ROM地址为0x0008,循环读取其中的128位数据)*************

      rd_val = spi_wr_1bit_cmd_read_16bit();
      rom_rd[rom_addr] = (unsigned short) rd_val & 0xFFFF;
    }
}

在这里插入图片描述

总体框图

在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-07 13:59:53  更:2021-10-07 14:00:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:20:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码