【硬件通讯协议】SIP总线协议以及模拟(软件)SPI
参考资料
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相关推荐
- UART总线协议详解
文章目录 1.UART概念 1.1硬件连接 2. RS232总线协议 2.1硬件连接 3. RS485总线协议 3.1硬件连接 1.UART概念 UART(Universal Asynchrono ...
- CANOpen系列教程02_理解CAN总线协议
推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!https://www.cnblogs.com/captainbed 正文: CANOpen ...
- AMBA总线协议(三)——一文看懂AHB总线所有协议总结(AHB2 AHB-Lite AHB5 )
AMBA AHB 总线协议介绍请点击以下链接: AMBA总线协议(一)--一文看懂APB总线协议 AMBA总线协议(二)一文看懂AMBA2 AHB2与AMBA3 AHB-Lite总线协议的区别 AMB ...
- 工业通讯领域的总线、协议、规范、接口、数据采集与控制系统
一.工控安全 工控,指的是工业控制自动化,主要利用电气.机械.软件组合的方式实现, 即是工业控制系统,或者是工厂自动化控制.工控安全指的是工业控制系统的数据.网络和系统安全. 随着工业信息化的迅猛发展 ...
- sip 时序图_SPI总线协议及SPI时序图详解
一.SPI总线介绍 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根 ...
- SPI总线协议、SPI时序图详解、GPIO模拟SPI
SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚 ...
- 单片机软件模拟SPI接口—加深理解SPI总线协议
单片机软件模拟SPI接口-加深理解SPI总线协议 SPI(Serial Peripheral Interfacer 串行外设接口)是摩托罗拉公司推出的一种同步串行通讯接口,用于微处理器臌控制器和外 ...
- LIN总线协议详解7(LIN帧收发的硬件实现)
帧收发的硬件实现 目录 帧收发的硬件实现 一.组成 二.协议控制器 1.协议控制器介绍 2.实现方法 三.总线收发器 1.实现方案 2.采用IC厂家的集成方案 四.LIN 总线 五.时钟源 六.EMI ...
- 硬件通讯协议的数据传输方式
硬件协议数据传输的包含要素主要为:物理介质,编码方式,通讯协议,传输特点. 下面就对常见的硬件通讯协议进行简单总结. 1. UART LSB First 2. USB LSB First,小端传输 ...
最新文章
- 你想要的宏基因组-微生物组知识全在这
- python自学步骤-怎么自学python,大概要多久?
- [云炬python3玩转机器学习笔记] 3-6Numpy数组和矩阵的合并和分割
- BugKuCTF WEB flag在index里
- 《网易编程题》疯狂队列
- [EmguCV|C#]使用CvInvoke自己繪製色彩直方圖-直方圖(Hitsogram)系列(4)
- 为何setRequestMethod(GET)不生效
- mysql from_unixtime(_MySQL 数据库中日期与时间函数 FROM_UNIXTIME(), UNIX_TIME()
- ios沙盒查找图片展示
- Matlab编程与C编程的不同
- vivo21a点击android版本,VIVO X21A原厂线刷救砖包_内附工具可救砖
- opencv 4.5.2 使用比色卡进行颜色校正
- ECommerceCrawlers项目分析(十二)
- 前IBM人工智能科学家为你解读AI行业的三大核心素养
- 大数据分析流程步骤都有哪些
- 模拟MP-BGP建立全过程(BGP MPLS vpn)
- Introducing Android Instant Apps - Google I-O 2016 翻译字幕
- 比基尼新娘沉醉花海之爱。(组图)
- CAD显示全屏控件(网页版)
- PS高阶操作之字体特效
热门文章
- 山冈庄八-德川家康-崛起三河(1)
- 江山易改本性难移之UART要点
- Vue 跨域请求报错No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.
- javaweb项目毕业设计基于SpringBoot的电商购物平台设计与实现(论文+程序源码+数据库文件)
- rfa 文件读取_RFA文件扩展名 - 什么是.rfa以及如何打开? - ReviverSoft
- gazebo仿真遇到的FCU问题
- leetcode 5370. 设计地铁系统(C++)
- 计算机打印出现kernel错误,打印机在打印时出现错误信息?
- 收藏夹吃灰!2 万字系统总结,带你实现 Linux 命令自由~
- 【板栗糖GIS】arcmap—怎么删除面外面的点