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 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> C51 - SPI总线概述读写25AA020A EEPROM -> 正文阅读

[嵌入式]C51 - SPI总线概述读写25AA020A EEPROM

一.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;
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:22:30  更:2022-08-19 19:26:20 
 
开发: 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年5日历 -2024/5/18 15:03:04-

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