参考资料

NXP 官方网站提供的 SPI 总线规范

S12SPIV4.pdfhttps://www.nxp.com/files-static/microcontrollers/doc/ref_manual/S12SPIV4.pdfSPI 是 Motorola 提出的,被收购后是分给了恩智浦吧!

真的很无语,就是一个规范而已,CSDN上还那么多要下载积分才能下载的搬运工!

SPI协议需参考IIC协议,对于SPI协议介绍没有非常细致!

【硬件通讯协议】IIC总线协议以及模拟(软件)IICII2总线的介绍,软件IIC基于C51的实现方法。提供部分代码供为参考!https://blog.csdn.net/qq_41650023/article/details/126207398?spm=1001.2014.3001.5502


SPIBus

SPI是4线制总线:MISO、MOSI、SCLK、CS。SPI是全双工的!

  • MISO:Master input slave output(主机输入,从机输出)数据流由从机到主机
  • MOSI:Master output slave input(主机输出,从机输入)数据流由主机到从机
  • SCLK:Serial Clock(串行时钟信号线)时钟信号由主机产生
  • CS/SS:Chip select / Slave select(片选信号)

对于不同的公司命名方面可能有些差异,但是功能是相同的!

SPI 和 IIC 也较为相似,具体再详细看 IIC 协议!

SPI 一般被作用于一主多从的状态。

SPI由于不同生产厂商,数据输入输出、时钟频率指标都会不同,要查手册!!!!

通讯模式

CS 信号由高变低,是 SPI 的起始信号。CS 信号由低变高,是 SPI 的停止信号。

片选是低电平有效,最好加上拉电阻

写数据也是没有硬性规定的,可以先写高位,也可以先写低位!

单独接CS

单独进行和某一个从机的通讯,CS可以用二进制解码芯片来拓展。例如3-8译码器。

SPI通信含有移位寄存器的器件

此时同时进行片选,但数据过多时,会从Peripheral1溢出到Peripheral2,最适合驱动数码管或者LED点阵了啊!!!这种连接方式被称为:菊花链。

时钟相位和时钟极性

SPI 有四种通讯模式,根据时钟极性(CPOL/SPO)、时钟相位(CPHA/SPH)所控制。

  • CPOL = 1:SCK信号线在空闲时为高电平
  • CPOL = 0:SCK信号线在空闲时为低电平
  • CPHA = 1:数据线在 SCK 的“偶数边沿”被采样
  • CPHA = 0:数据线在 SCK 的“奇数边沿”被采样

至于是上升沿还是下降沿采样,需要结合CPOL和CPOH共同判断!

Transfer Mode CPOL CPHA 采样效果
Mode 0 0 0 第一个边沿为上升沿,奇数边沿采样(上升沿数据采样)
Mode 1 0 1 第一个边沿为上升沿,偶数边沿采样(下降沿数据采样)
Mode 2 1 0 第一个边沿为下降沿,奇数边沿采样(下降沿数据采样)
Mode 3 1 1 第一个边沿为下降沿,偶数边沿采样(上升沿数据采样)

主机和从机在相同的模式下才可以正常进行通讯!


SPI总线接口的软件实现-89C51

采用和X5045进行通讯作为例子!

SCK信号线在空闲时为低电平

sbit SPI_SO = P1^1;
sbit SPI_SI = P1^6;
sbit SPI_SCK = P1^4;
sbit SPI_CS = P1^2;

SPIBus发送一个字节数据

void SPI_WriteByte(unsigned char byte)
{unsigned char i;unsigned char tmp;for(i=0; i<8; i++){SPI_SCK = 0;tmp = byte & 0x80;if(tmp == 0x80){SPI_SI = 1;_nop_();}else{SPI_SI = 0;_nop_();}SPI_SCK = 1;byte = byte<<1;}
}

SPIBus接收一个字节数据

unsigned char SIP_ReadByte()
{unsigned char i;unsigned char byte = 0;for(i=8; i>0; i--){byte = byte<<1;SPI_SCK = 1;_nop_();_nop_();SPI_SCK = O;_nop_();_nop_();byte = byte | (unsigned char)SPI_SO;}return byte;
}

SPIBus开始/结束

void SPI_Start(void)
{SPI_CS = 1;_nop_();_nop_();SPI_SCK = 0;_nop_();_nop_();SPI_CS = 0;_nop_();_nop_();
}void SPI_End(void)
{SPI_SCK = 0;_nop_();_nop_();SPI_CS = 1;_nop_();_nop_();
}

X5045相关的程序

#define WREN     0X06    // 设置写使能锁存器
#define WRDI     0X04    // 复位写使用锁存器
#define RSDR     0X05    // 读状态寄存器
#define WRSR     0X01    // 写状态寄存器
#define READ     0X03    // 读操作指令 0000 A8 011
#define WRITE    0X02    // 写操作指令 0000 A8 010
#define WIP      0X01    // 状态寄存器写操作是否正忙

读取X5045状态寄存器功能

unsigned char X5045_ReadStatus(void)
{unsigned char tmp;SPI_Start();SPI_WriteByte(RSDR);tmp = SPI_ReadByte();return tmp;
}

写X5045状态寄存器功能

void X5045_WriteStatus(unsigned char status)
{unsigned char tmp;SPI_Start();SPI_WriteByte(WREN);SPI_End();SPI_Start();SPI_WriteByte(WRSR);SPI_WriteByte(status);SPI_End();d0{SPI_Start();SPI_WriteByte(RSDR);tmp = SPI_ReadByte();SPI_End();}while(tmp&WIP);
}

读X5045指定地址EEPROM中的数据

unsigned char X5045_ReadAddrData(unsigned char addr)
{unsigned char addr_tmp,tmp;unsigned char read_cmd;if(addr > 255)read_cmd = READ|0X08;elseread_cmd = READ;addr_tmp = (unsigned char)(addr & 0xff);SPI_Start();SPI_WriteByte(read_cmd);SPI_WriteByte(addr_tmp);tmp = SPI_ReadByte();SPI_End();return tmp;
}

写X5045指定地址EEPROM中的数据

void X5045_WriteAddrData(unsigned char addr, unsigned char edate)
{unsigned char addr_tmp,tmp;unsigned char cmd_tmp;SPI_Start();SPI_WriteByte(WREN);SPI_End();if(addr > 255)cmd_tmp = WRITE|0X08;elsecmd_tmp = WRITE;addr_tmp = (unsigned char)(addr & 0xff);SPI_Start();SPI_WriteByte(cmd_tmp);SPI_WriteByte(addr_tmp);SPI_WriteByte(edate);SPI_End();d0{SPI_Start();SPI_WriteByte(RSDR);tmp = SPI_ReadByte();SPI_End();}while(tmp&WIP);
}

喂狗

void X5045_WDT(void)
{SPI_CS = 0;_nop_();_nop_();SPI_CS = 1;_nop_();_nop_();
}

最后由于此芯片用到的较少,就介绍到此!


参考:

Serial Peripheral Interface (SPI) - learn.sparkfun.com

主要理解SPI的传输协议,用硬件SPI不就香多了!!

【硬件通讯协议】SIP总线协议以及模拟(软件)SPI相关推荐

  1. UART总线协议详解

    文章目录 1.UART概念 1.1硬件连接 2. RS232总线协议 2.1硬件连接 3. RS485总线协议 3.1硬件连接 1.UART概念   UART(Universal Asynchrono ...

  2. CANOpen系列教程02_理解CAN总线协议

    推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!https://www.cnblogs.com/captainbed 正文: CANOpen ...

  3. AMBA总线协议(三)——一文看懂AHB总线所有协议总结(AHB2 AHB-Lite AHB5 )

    AMBA AHB 总线协议介绍请点击以下链接: AMBA总线协议(一)--一文看懂APB总线协议 AMBA总线协议(二)一文看懂AMBA2 AHB2与AMBA3 AHB-Lite总线协议的区别 AMB ...

  4. 工业通讯领域的总线、协议、规范、接口、数据采集与控制系统

    一.工控安全 工控,指的是工业控制自动化,主要利用电气.机械.软件组合的方式实现, 即是工业控制系统,或者是工厂自动化控制.工控安全指的是工业控制系统的数据.网络和系统安全. 随着工业信息化的迅猛发展 ...

  5. sip 时序图_SPI总线协议及SPI时序图详解

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

  6. SPI总线协议、SPI时序图详解、GPIO模拟SPI

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

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

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

  8. LIN总线协议详解7(LIN帧收发的硬件实现)

    帧收发的硬件实现 目录 帧收发的硬件实现 一.组成 二.协议控制器 1.协议控制器介绍 2.实现方法 三.总线收发器 1.实现方案 2.采用IC厂家的集成方案 四.LIN 总线 五.时钟源 六.EMI ...

  9. 硬件通讯协议的数据传输方式

    硬件协议数据传输的包含要素主要为:物理介质,编码方式,通讯协议,传输特点. 下面就对常见的硬件通讯协议进行简单总结. 1. UART LSB First  2. USB LSB First,小端传输 ...

最新文章

  1. 你想要的宏基因组-微生物组知识全在这
  2. python自学步骤-怎么自学python,大概要多久?
  3. [云炬python3玩转机器学习笔记] 3-6Numpy数组和矩阵的合并和分割
  4. BugKuCTF WEB flag在index里
  5. 《网易编程题》疯狂队列
  6. [EmguCV|C#]使用CvInvoke自己繪製色彩直方圖-直方圖(Hitsogram)系列(4)
  7. 为何setRequestMethod(GET)不生效
  8. mysql from_unixtime(_MySQL 数据库中日期与时间函数 FROM_UNIXTIME(), UNIX_TIME()
  9. ios沙盒查找图片展示
  10. Matlab编程与C编程的不同
  11. vivo21a点击android版本,VIVO X21A原厂线刷救砖包_内附工具可救砖
  12. opencv 4.5.2 使用比色卡进行颜色校正
  13. ECommerceCrawlers项目分析(十二)
  14. 前IBM人工智能科学家为你解读AI行业的三大核心素养
  15. 大数据分析流程步骤都有哪些
  16. 模拟MP-BGP建立全过程(BGP MPLS vpn)
  17. Introducing Android Instant Apps - Google I-O 2016 翻译字幕
  18. 比基尼新娘沉醉花海之爱。(组图)
  19. CAD显示全屏控件(网页版)
  20. PS高阶操作之字体特效

热门文章

  1. 山冈庄八-德川家康-崛起三河(1)
  2. 江山易改本性难移之UART要点
  3. Vue 跨域请求报错No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.
  4. javaweb项目毕业设计基于SpringBoot的电商购物平台设计与实现(论文+程序源码+数据库文件)
  5. rfa 文件读取_RFA文件扩展名 - 什么是.rfa以及如何打开? - ReviverSoft
  6. gazebo仿真遇到的FCU问题
  7. leetcode 5370. 设计地铁系统(C++)
  8. 计算机打印出现kernel错误,打印机在打印时出现错误信息?
  9. 收藏夹吃灰!2 万字系统总结,带你实现 Linux 命令自由~
  10. 【板栗糖GIS】arcmap—怎么删除面外面的点