一.SPI硬件原理


  • 单主单从的连接方式

    如果只有一个从机器件,SS片选型号线,直接接地。
  • 单主多从连接模式

二.SPI四种模式


图中以CPOL/CPHA = 1 ,举例 总线空闲状态为高电平,代表第一个时钟沿为下降沿,数据输出在一个时钟周期的第一个沿。== 数据采样==在第二个沿。
当CPHA = 0时,表示数据的采样是在一个时钟周期的第一个沿。
数据输出:总机往从机上写数据
数据采样:从机开始读取数据

三.25AA02A的应用

  • 25AA02A EEPROM

EEPROM包括了一个8位的指令寄存器,可通过sI访问,并在SCK上升沿移入数据,执行此操作时,CS引脚必须保持低电平,HOLD引脚必须保持高电平。
引脚DI:用作于输入数据信号,另一个作用是选择通道控制; 引脚DO:一般作用是输出数据信号,还可以用作转换数据的输出;

三.编程

bsp_spi.c


这里是从机器件手册,说明主机开始数据输入时(sck = 1),从机开始采样。

//完成底层spi操作,读写一字节
/*******************************************************************************
Function    : spi_write_byte
Description : 完成底层spi操作,写一字节
Input       :  byte 写入的字节数据
Output      : 无
Return      : 无
*******************************************************************************/
void spi_write_byte(unsigned char byte)   //
底层操作,不涉及器件
{unsigned char i;for (i=0;i<8;i++){sck = 0;if((dat & 0x80) == 0x80)             //高位先行。判断当前输入是1还是0。这时是最高位。{DI = 1;}else{DI = 0;}dat = dat << 1;     // dat <<= 1;sck = 1;  //之前操作,已经将数据准备好了,当sck = 1时,上升沿时数据开始采样}
}


这里是从机器件手册,说明从机开始数据输出时(sck = 1),主机开始采样。

/*******************************************************************************
Function    : spi_read_byte
Description : 使用SPI读取一个字节的数据,sck在从0->1时需要将数据准备好
Input       :  byte 写入的字节数据
Output      : 无
Return      : 无
*******************************************************************************/
void spi_read_byte()
{unsigned char i;unsigned char dat;       //返回值dat <<= 1;               //高位先行,将第一次取得数据移到最高位上for (i=0;i<8;i++){sck = 0;    sck = 1;             //先数据输出到总线上,然后判断0还是1,主机采样if((D0 == 1)         {dat |= 0x01;     //  (dat = dat |0x01)dat和0x01做“或”的运算,意思是最低位置1,其它位保持不变}else{dat &= ~0x01;   // (dat = dat & ~0x01) dat = dat  & 1111 1110;将最低位 P1_0 置0,其他位不变 }return dat;
}

msp_25AA020A.c

  • 读序列



/*******************************************************************************
Function    : 25AA020A_read
Description : 器件的读写
Input       :  addr 从哪地址开始读起
Output      : 无
Return      : 无
*******************************************************************************/
unsigned char 25AA020A_read(unsigned char addr)   //从EEPROM哪里开始读起
{unsigned char dat;       //返回值CS = 0 ;spi_read_byte(25AA020A_READ);  //利用spi读指令spi_read_byte(addr);dat = spi_read_byte();CS = 1 ;return dat;
  • 写序列



写使能 ,控制CS拉低。然后写指令。#define 25AA020A_WREN 0x06

/*******************************************************************************
Function    : 25AA020A_write_enable
Description : 写使能函数
Input       : 无
Output      : 无
Return      : 无
*******************************************************************************
void 25AA020A_write_enable(){CS = 0 ;void spi_write_byte(25AA020A_WREN);CS = 1 ;}




/*******************************************************************************
Function    : 25AA020A_read
Description : 器件的读写
Input       :  addr 从哪地址开始读起
Output      : 无
Return      : 无
*******************************************************************************/
unsigned char 25AA020A_write(unsigned char addr,unsigned char dat)
{unsigned char state;25AA020A_write_enable();CS = 0 ;spi_write_byte(25AA020A_WRITE);spi_write_byte(addr);spi_write_byte(dat);while(1);            //写周期时间 TWS为6ms。两种方式,一种延时,一种写状态判断。{CS = 0;spi_write_byte(25AA020A_RDSR );state = spi_read_byte(); //读的是状态寄存器中的最低位。为1还没写完。if((state &=0x01) == 0)   //判断最低位是否写完成{break;}CS = 1;}CS = 1 ;
}

msp_25AA020A.h

#define 25AA020A_READ       0x03;  //读指令
#define 25AA020A_WRITE      0x02;  //写使能指令
#define 25AA020A_WREN       0x06;
#define 25AA020A_WRDI       0x04;
#define 25AA020A_RDSR       0x05; //读状态指令
#define 25AA020A_WRSR       0x01;

C51 - SPI总线概述读写25AA020A EEPROM相关推荐

  1. linux内核SPI总线驱动分析(一)

    下面有两个大的模块: 一个是SPI总线驱动的分析            (研究了具体实现的过程) 另一个是SPI总线驱动的编写(不用研究具体的实现过程) SPI总线驱动分析   1 SPI概述     ...

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

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

  3. 学习STM32 Flash存储 W25Q64 SPI总线存储模块进行读写数据

    今天学习 Flash 存储芯片进行数据写入和读取方法.了解W25Q64 存储芯片的使用.能够用 STM32 单片机对 W25Q64 进行写入数据,擦除数据,读取数据. w25q64 是什么? W25Q ...

  4. 51单片机对SPI总线上挂接多个25AA040的读写操作+Proteus仿真

    51单片机对SPI总线上挂接多个X5045的读写操作+Proteus仿真 Proteus仿真图 实例代码 //对SPI总线上挂接多个25AA040的读写操作 #include<reg51.h&g ...

  5. Xilinx-Spartan6-学习笔记(24):通过SPI总线读写FLASH

    Xilinx-Spartan6-学习笔记(24):通过SPI总线读写FLASH 利用SPI总线实现对FLASH进行读写,写入255个数据再读出255个数据.(这里为了模拟SDO信号,随机生成了0~1信 ...

  6. SPI协议、MCP2515裸机驱动详解----主流SPI总线接口原理

    最近看到一个介绍SPI接口原理的帖子,看完觉得甚好.特来分析给大家一起学习. SPI概述 Serial Peripheral interface 通用串行外围设备接口 是Motorola首先在其MC6 ...

  7. 基于I2C/SPI总线的温湿度采集与OLED显示

    实验一 实验目的 学习I2C总线通信协议,使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集,并将采集的温度-湿度值通过串口输出.具体任务: 1)解释什么是"软件I2 ...

  8. 总线概述及常见总线(转)

    一. 总线概念 所谓总线(Bus),是指计算机设备和设备之间传输信息的公共数据通道.总线是连接计算机硬件系统内多种设备的通信线路,它的一个重要特征是由总线上的所有设备共享,可以将计算机系统内的多种设备 ...

  9. SPI总线的原理与Verilog实现

    一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1. FPGA型号:Xilinx公 ...

最新文章

  1. 为什么分布式一定要有延时任务?
  2. python 类-python类定义的讲解
  3. 从GBIP到PXI 的发展简史
  4. unique离散化用法
  5. magento effects.js jquery.lazyload.js 冲突
  6. VUE使用lodop实现前端打印页面指定内容
  7. 计算机应用基础本科答案排序,计算机应用基础本科操作题
  8. WPF自定义控件与样式-自定义按钮(Button)
  9. 解决 微信小程序 滚动 事件穿透 问题
  10. 基于C#制作的简易代码生成器
  11. 像素值/DN值/数字量化值
  12. Python 合并两个或多个pdf文件(获取pdf文件指定页)
  13. 用Python给弟弟生成1000道算术题
  14. CTF·Crypto·古典密码大全
  15. Ubuntu下安装Remix OS双系统
  16. 400 行 C 代码实现一个虚拟机
  17. [数学基础知识] Cramér‘s V 相关系数和Python算法实现
  18. linux下wifi设备的实现逻辑
  19. git 冲突解决一把梭
  20. allegro设置差分线

热门文章

  1. Direct3D 实例
  2. [C语言]国王的许诺:相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相西萨自己选择何种赏赐。这位聪明的宰相指着8 × 8共64格的象棋盘说:陛下,请您赏给我一些麦子吧。。。
  3. 淮阴工学院计算机科学与技术宿舍,淮阴工学院宿舍条件,宿舍环境图片(10篇)
  4. 大數據分析Excel Power BI全方位應用彩色版
  5. 马来酰亚胺偶联二硒化钨 (WSe2-MAL)|N-羟基琥珀酰亚胺偶联WSe2二硒化钨纳米颗粒 (WSe2-NHS)
  6. SEP客户端C盘空间被xfer目录占满
  7. 议程设置理论在公关活动中的应用
  8. 在北大的BBS上听到的原创歌曲不错
  9. 【动态烟花】动态烟花HTML网页源码分享
  10. 手机python3.8.5软件_Python|Python v3.8.7 for Linux下载_网站源码_站长下载