使用SPI与外部flash(MX25L6406EM21)IC通信

  • 连接方式

                  

如上图所示,MCU通过SPI2与外部flash芯片进行相连接。

  • MCU spi2初始化

                

    定义SPI2 中所使用的SPI 端口号

spi2中 通信功能初始化

读数据与写数据

  • 指令说明

查看flash芯片的datasheet,mx25芯片支持按照页来写,按照扇区来擦除。page_program 为 0x02    ,sector_erase为0x20。并且在向每个页中写数据前,必须先保证此页所在的扇区已经进行擦除操作。并且每一页最大写256byte ,一个扇区的大小为4Kbyte

  • 写数据,按照页来写数据(写一页数据)

依据芯片写指令 0x06

void spi_flash_write_page(uint8_t* pBuffer,uint32_t write_address,uint16_t num_byte_to_write) //向页中写入数据,其中write_address必须为256的整数据部,即一页的开始位置,
{
uint16_t i=; // debug_out("SpiPage:0x%08x Len:%d\r\n", write_address, num_byte_to_write); spi_flash_wait_busy(); //忙等待
spi_flash_write_enable();
spi_flash_wait_busy(); spi2_cs_low();
spi2_read_write_byte(MX25_PAGE_PROGRAM);
spi2_read_write_byte((uint8_t) ( ((write_address) >> )&0xFF) );
spi2_read_write_byte((uint8_t) ( ((write_address) >> )&0xFF) );
spi2_read_write_byte((uint8_t) ( (write_address)&0xff ) ); for(i=;i<num_byte_to_write;i++)
{
spi2_read_write_byte(pBuffer[i]);
}
spi2_cs_high();
spi_flash_wait_busy(); }
  • 擦除扇区
void spi_flash_erase_sector(uint32_t addr)   //addr地起为4K的倍数,清除一个扇区
{
spi_flash_wait_busy();
spi_flash_write_enable();
spi_flash_wait_busy(); //½øÐвÁ³ý²Ù×÷
spi2_cs_low();
spi2_read_write_byte(MX25_SECTOR_ERASE);
spi2_read_write_byte((uint8_t) ( ((addr) >> )&0xFF) );
spi2_read_write_byte((uint8_t) ( ((addr) >> )&0xFF) );
spi2_read_write_byte((uint8_t) ( (addr)&0xff ) );
spi2_cs_high();
spi_flash_wait_busy();
}
  • 在指定地址处开始写入指定长度的数据

从指定地址,写入指定长度数据。也是从一个扇区的开始处进行写,计算出一共需要写入多少页,同时如果为一个扇区的开始处,记得需要进行扇区擦除操作。

void spi_flash_write(uint8_t* pBuffer,uint32_t address,uint16_t buffer_len)
{
uint16_t pageCount = ;
uint16_t pageIndex = ;
uint16_t length = ;
uint16_t i=;
pageCount = buffer_len / SPI_FLASH_PAGE_SIZE;
if( ( buffer_len % SPI_FLASH_PAGE_SIZE ) != )
{
pageCount += ;
}
while( pageIndex < pageCount )
{
length = buffer_len - ( pageIndex * SPI_FLASH_PAGE_SIZE ) ;
length = length > SPI_FLASH_PAGE_SIZE ? SPI_FLASH_PAGE_SIZE : length;
if( ( ( address + pageIndex * SPI_FLASH_PAGE_SIZE ) % SPI_FLASH_SECTOR_SIZE ) == )
{
spi_flash_erase_sector( address + pageIndex * SPI_FLASH_PAGE_SIZE );
}
spi_flash_write_page(pBuffer + pageIndex * SPI_FLASH_PAGE_SIZE, address + pageIndex * SPI_FLASH_PAGE_SIZE, length );
pageIndex ++;
}
}
  • 读数据

读数据相对于写数据来说,显得比较简单的多,从指定地址开始读,读取指定的长度

void spi_flash_read(uint8_t* pBuffer,uint32_t read_address,uint16_t num_byte_to_read)
{
uint16_t i=;
spi_flash_wait_busy(); spi2_cs_low(); spi2_read_write_byte(MX25_READ_DATA);
spi2_read_write_byte((uint8_t) ( ((read_address) >> )&0xFF) );
spi2_read_write_byte((uint8_t) ( ((read_address) >> )&0xFF) );
spi2_read_write_byte((uint8_t) ( (read_address)&0xff ) ); for(i=;i<num_byte_to_read;i++)
{
pBuffer[i]=spi2_read_write_byte(0xFF);
} spi2_cs_high(); }

至此整个驱动编写完成。

stm32f10x单片机进阶--spi使用的更多相关文章

  1. 利用C51单片机模拟SPI进行双机通信

    SPI协议简述 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口.由Motorola首创.SPI接口主要应用在 EEPROM,FLASH,实时时 ...

  2. OLED的波形曲线、进度条、图片显示(STM32 HAL库 模拟SPI通信 5线OLED屏幕)详细篇

    少废话,先上效果图 屏幕显示效果         全家福 一.基础认识及引脚介绍 屏幕参数: 尺寸:0.96英寸 分辨率:128*64 驱动芯片:SSD1306 驱动接口协议:SPI 引脚说明: 二. ...

  3. SPI总线通信电路设计

    数据带宽=(总线频率×数据位宽)÷8 B表示带宽,F表示存储器时钟频率,D表示存储器数据总线位数,则带宽为: B(峰值带宽)=F(时钟频率MHz)×D(总线位数bit)/8 例如,PC-100的SDR ...

  4. pixy&STM32使用记录(串口&SPI外设)

    先踏踏实实的把stm32的外设串口,SPI搞清楚,不要眼高手低,看不起小事.用SPI通信将pixy的数据读出来,将数据用串口发到串口助手上,然后处理数据,利用STM32的定时器调节pwm,控制电机,先 ...

  5. Linux设备驱动剖析之SPI(一)

    写在前面 初次接触SPI是因为几年前玩单片机的时候,由于普通的51单片机没有SPI控制器,所以只好用IO口去模拟.最近一次接触SPI是大三时参加的校内选拔赛,当时需要用2440去控制nrf24L01, ...

  6. 说说SPI协议

    SPI,是英语Serial Peripheral Interface 的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管 ...

  7. spi调试步骤,mcp2515调试整理

    1.先查看也硬件电路,一般都是单片机作为master,其他芯片作为slave.单片机的MOSI对应从机的SI,单片机的MISO对应从机的SO,如果两个引脚接反了,那是怎么调试都没有效果的. 2.单片机 ...

  8. 海思3516系列芯片SPI速率慢问题深入分析与优化(基于PL022 SPI 控制器)

    海思3516系列芯片SPI速率慢问题深入分析与优化(基于PL022 SPI 控制器) 我在某个海思主控的项目中需要使用SPI接口来驱动一块液晶屏,液晶屏主控为 st7789,分辨率 240x240,图 ...

  9. nRF24L01芯片控制——迈向无线的第一步

    nRF24L01芯片是一款专供单片机的射频收发芯片.工作于2.4GHz~2.5GHz ISM频段.融合了shockburst技术. 我先列出该芯片的硬件参数资料: 至于每个引脚的具体用途,可以参见技术 ...

随机推荐

  1. python 开发工具IDE pycharm的破解版安装

    打开终端 cd /etc 命令行输入 sudo vim hosts 输入mac密码 输入i,进入编辑模式(注意在英文状态下书写) 粘贴0.0.0.0 account.jetbrains.com到文件最 ...

  2. web站点启用https (二)

    接上篇内容 二.实际配置案例 实验案例:为web站点启用https 实验环境:seven公司有一个web站点,域名为www.seven.com,启用的身份验证方式是基本验证方式.随着业务发展想成为网上 ...

  3. 编程开发之--java多线程学习总结(2)同步代码块

    1.第一种解决办法:同步代码块,关键字synchronized package com.lfy.ThreadsSynchronize; /** * 1.使用同步代码块 * 语法: synchroniz ...

  4. Luogu P1342 请柬 题解

    差不多是Dijkstra的裸题吧... 这道题可以分为来回两个阶段. 去的时候很简单,直接用一次Dijkstra,然后统计答案. 回来的时候就有些巧妙了,虽然表面上是每个点回到起点,但是何尝不可将其看 ...

  5. 【HNOI2019】部分题简要题解

    题意懒得写了 LOJ Day 1 T1 鱼 个人做法比较猎奇,如果有哪位大佬会证明能分享一下的话感激不尽. 题解:枚举鱼尾和鱼身的交点D,将所有其他点按照到D的距离排序,距离相同的分一组. 感性的理解 ...

  6. vsftpd文件虚拟用户搭建

    关于vsftpd的原理这里就不多说了,下面红色部分有单独标出,突出显示,意思是这里的东西有额外的配置,全文的配置一定要跟着第二步的配置来,不要过程中随便改变参数,除非你看得懂,好了直接上配置过程 1. ...

  7. io流之节点流inputstream、outputstream、reader、writer

    例子程序:读取工作空间下 package io; import java.io.*; public class TestFileInputStream { public static void mai ...

  8. PHP 对目录下所有TXT进行遍历 并正则进行处理 preg_replace

    <?php set_time_limit(); //遍历 指定目录下的所有 文件/ $pattern是要匹配的 文件规则 function file_list($dir,$pattern=&qu ...

  9. redis 数据库迁移

    老大让把 一台机器上 redis 中所有的数据,迁移到另一台机器上 查了一下可以拷贝 rdb 文件, 此方法只适用于迁移到一个新的库, 迁移到正在使用的库就不行了, 而且 rdb 里面是所有的 db, ...

  10. OpenJDK编译运行

    获取OpenJDK源码有两种方式,其中一种是通过Mercurial代码版本管理工具从Repository中直接取得源码(Repository地址:http://hg.openjdk.java.net/ ...