SPI总线 的使用 和 裸机程序编写
来源:互联网 发布:python 服务 编辑:程序博客网 时间:2024/06/03 22:54
SPI总线介绍
SPI总线结构:
SPI(Serial Peripheral Interface)串行外设接口,是一种高速的,全双工,同步的通信总线。采用主从模式(Master Slave)架构,支持多个slave,一般仅支持单Master。
SPI接口共有4根信号线,分别是:设备选择线(SS)、时钟线(SCK)、串行输出数据线(MOSI)、串行输入数据线(MISO)。
数据传输过程:
主节点通过 MOSI 线输出数据,从节点在 SIMO 处从主节点读取数据。同时,也在通过 SOMI 输出 MSB(最高位),主节点会在 MISO处读取从节点的数据,整个过程将一直持续,直至交换完所有数据。
总线时序:
CPOL极性:决定时钟空闲时为高电平还是低电平。
CPOL=0:CLK空闲时是低电平,CLK有效时是高电平。
CPOL=1: CLK空闲时是高电平,CLK有效时是低电平。
CPHA相位:决定何时进行数据采样(读取)
CPHA=0:第一个边沿采样
CPHA=1:第二个边沿采样
根据CPOL和CPHA的不同组合,SPI被分为4种模式。
SPI总线裸机程序
以6410开发板为例:
SPI有两个通道,分别为TX通道和RX通道,CPU要写数据到FIFO中,先写数据到 SPI_ TX_ DATA 寄存器中,这样此寄存器中的内容就会自动移动到发送FIFO中;同样的道理,如果CPU要从接收FIFO中读取数据,就访问寄存器 SPI_ RX_ DATA,紧接着,接收FIFO的数据就会自动移动到 SPI_ RX_ DATA 寄存器中。
裸机代码举例:
#define CH_CFG0 (*(volatile unsigned long*) 0x7f00b0000)#define CLK_CFG0 (*(volatile unsigned long*) 0x7f00b0004)#define MODE_CFG0 (*(volatile unsigned long*) 0x7f00b0008)#define SPI_STAS0 (*(volatile unsigned long*) 0x7f00b0014)#define SPI_TXDATA0 (*(volatile unsigned long*) 0x7f00b0018)#define SPI_RXDATA0 (*(volatile unsigned long*) 0x7f00b001C)u8 SPI_Init(){ /* SPI复位 */ CH_CFG0 |= 0x60; //设置第5位进行软件复位 /* 设置引脚,这些引脚与spi引脚复用 */ rGPCCON &= ~0xffff; rGPCCON |= 0x2222; /* 配置CFG寄存器 */ CH_CFG0 = 0b0111; /* 配置MODE_CFG0寄存器 */ MODE_CFG0 = (63 << 11); /* 设置时钟 */ CLK_CFG0 = 100; CLK_CFG0 |= (1 << 8); return 0; }u32 SPI_ReadWriteData(u32 TxData) //参数是要发送的数据{ do { temp = (SPI_STAS0 >> 6) & 0x7f; //获取发送FIFO数据数量 } while(temp > 63); //发送FIFO满了,等待 SPI_TXDATA0 = TxData; //发送数据 do { temp = (SPI_STAS0 >> 13) & 0x7f; //获取接收FIFO数据数量 } while(temp == 0); //接收FIFO为空,等待 return SPI_RXDATA0;}int main(void){ SPI_Init(); while(1) { SPI_ReadWriteData(5); }}
阅读全文
0 0
- SPI总线 的使用 和 裸机程序编写
- SPI总线介绍和裸机编程分析
- 基于spi总线驱动程序的编写
- 基于spi总线驱动程序的编写
- I2C总线和SPI总线
- SPI总线的工作方式和特点
- SPI总线和I2C总线的异同点
- I2C和SPI总线
- IIC和SPI总线
- 基于S5PC100裸机程序之SPI(上)
- 基于S5PC100裸机程序之SPI(上)
- 基于S5PC100裸机程序之SPI
- spi协议->裸机程序->master驱动程序分析
- 关于I2C和SPI总线协议的基本概念和对比
- SPI总线测试和分析
- I2C和SPI总线对比
- IIC和SPI总线协议
- 关于IIC和SPI总线
- 002-20161115-2光明回应读者无限关于“佛家、道家,道家三清”的问题
- RSA实践
- ros 节点实现简易超声雷达串口通讯 模拟出激光雷达消息
- fancyTree学习笔记
- HDU 6069-Counting Divisors(多校训练第四场->区间质因数个数)
- SPI总线 的使用 和 裸机程序编写
- JVM调优:选择合适的GC collector (三)
- ios文字设置渐变色
- BZOJ 2301 [HAOI2011]Problem b (莫比乌斯反演)
- 1177: 按要求排序(指针专题)
- Linux环境安装nginx
- InternetReadFile 处理大数据
- Eclipse上的EGit插件使用详解
- Experience of Python Learning Week 2