SPI总线 的使用 和 裸机程序编写
2017-08-05 14:06
537 查看
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); } }
相关文章推荐
- 在ubuntu下使用StarterWare为BeagleBone-Black编写裸机程序并在CCS中用Jlink调试
- am335x在ubuntu下使用StarterWare编写裸机程序并在CCS中用Jlink调试
- 基于TX2440开发板在ADS1.2中编写LED的驱动(GPIO的使用)裸机程序
- am335x在ubuntu下使用StarterWare编写裸机程序并在CCS中用Jlink调试
- S3C2440 windows下使用jlink gdbserver,arm-none-eabi-gdb进行裸机程序编写调试
- 如何使用 VB 编写自动反安装的程序?
- 不使用Web服务器编写SOAP服务程序相关联接
- 使用C#编写的一个定时关机程序(我也不记得是谁写的了,偶翻出来了就贴了)
- 使用JAVA编写网络通信程序
- 使用CppUnit编写测试程序
- 使用eclipse编写hibernate程序 (alluser的专栏)
- 学习API HOOK,编写了一个winsock 的封包抓取程序,可免费使用;
- 使用C#编写的一个定时关机程序
- mono:直接使用MSIL指令编写mono程序
- Linux下,使用C/C++编写一个简单的消息处理程序
- 可启动程序编写环境的搭建和使用
- VC++下使用ADO编写数据库程序
- VC++下使用ADO编写数据库程序