GPIO模拟SPI

上次用gpio模拟i2c理解i2c协议,同样的,我用gpio模拟spi来理解spi协议。

我用的是4线spi,四线分别是片选、时钟、命令/数据、数据。

数据在时钟上升沿传递,数据表示的是数据还是命令由命令/数据线决定。

开始条件:

void spi_start(void)
{
	gpio_config(GPIO_CS, GPIO_OUTPUT);
	udelay(SPI_SPEED_DURATION);
	gpio_set(GPIO_CS, 0);/* start condition */
	udelay(SPI_SPEED_DURATION);
}

结束条件:

void spi_stop(void)
{
	gpio_set(GPIO_CS, 1); /* stop condition */
	udelay(SPI_SPEED_DURATION);
}

数据传输:

void spi_txdata_byte(uint8_t data)
{
	int i = 0;

	for(i = 7; (i >= 0)&&(i <= 7); i--) {
		gpio_set(GPIO_CLK, 0);//时钟上升沿传递数据
		udelay(SPI_SPEED_DURATION);
		if(i == 7) {
			gpio_config(GPIO_MOSI, GPIO_OUTPUT);
			udelay(SPI_SPEED_DURATION);
		}

		gpio_set(GPIO_MOSI, (data >> i) & 0x01);
		udelay(SPI_SPEED_DURATION);
		gpio_set(GPIO_CLK, 1);
		udelay(SPI_SPEED_DURATION * 2);
	}

	return;
}

GPIO模拟SPI

时间: 2024-11-05 18:55:29

GPIO模拟SPI的相关文章

使用GPIO模拟SPI总线进行通信

下面给出了模拟SPI总线在模式1下进行读写的伪代码,用以说明如何使用GPIO实现SPI通信:     #define SS      252                     //定义SS所对应的GPIO接口编号       #define SCLK    253                     //定义SCLK所对应的GPIO接口编号       #define MOSI    254                     //定义SCLK所对应的GPIO接口编号       

linux enc28j60网卡驱动移植(硬件spi和模拟spi)

本来想移植DM9000网卡的驱动,无奈硬件出了点问题,通过杜邦线链接开发板和DM9000网卡模块,系统上电,还没加载网卡驱动就直接崩溃了,找不到原因...刚好手上有一个enc28j60的网卡模块,于是就着手移植enc28j60的驱动. 其实移植enc28j60的驱动也十分简单,网上有现成的,只需要分配一些硬件资源即可. 由于我的内核版本老到掉牙,没有自带enc28j60的驱动,只能在网上找一个: enc28j60.c http://git.ti.com/ti-linux-kernel/ti-li

S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动

目录:一. 说明 二. 驱动程序说明及问题 三. 案例一       四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看发板,读写都行:通过增加一些调试信息,对linux i2c驱动其中的编写方法之一有了一定了解,在我的另外一篇博文有详细说明.但同时对在linux下GPIO模拟i2c产生了兴趣,于是就写这篇博文来记录驱动编写过程中遇到的问题.如果想了解了i2c时序,请google或百度一下. 本篇博文通过misc驱动

模拟SPI协议时序

SPI是串行外设接口总线,摩托罗拉公司开发的一种全双工,同步通信总线,有四线制和三线制. 在单片机系统应用中,单片机常常是被用来当做主机(MASTER),外围器件被当做从机(SLAVE). 所以,在以下的介绍中,都是默认单片机是主机模式进行说明的. SPI总线相对于IIC总线,无总裁机制,无应答机制. SPI常用的四线制分别是,MISO(主入从出).MOSI(主出从入).SCK(同步时钟线).CS(片选线,也有是NSS). 主从机之间典型的接线方式如下所示: 按照时钟线的时钟极性(CPOL)和相

gpio模拟i2c驱动

前段时间做项目,需要gpio模拟i2c通信,最后参考了一些资料,然后编写了一个程序.现在发出来,以免以后忘记,也为一些需要的朋友提供参考.不喜勿喷哈. /* 说明:该程序是基于atmel公司的sama5d35 MCU 用其中两个GPIO引脚模拟i2c通信. * 其中两个引脚连接到了hd1650上面.然后检测按键扫描的驱动 * */ 该程序可以作为gpio模拟i2c程序的参考.不同的平台,函数实现不同,但是i2c通信的时序和原理是相同的.希望对一些朋友有帮助. 1 #include<linux/i

STM32F207 两路ADC连续转换及GPIO模拟I2C给Camera Sensor初始化参数

1.为了更好的方便调试,串口必须要有的,主要打印一些信息,当前时钟.转换后的电压值和I2C读出的数据. 2.通过GPIO 模拟I2C对镁光的MT9V024进行参数初始化.之前用我以前公司SP0A19芯片,是I2C是8位宽的,而镁光的地址是8位,而数据位是16个字节, 其实不管是8位还是16位,每次发送都是8个字节然后一个应答位,所以只要稍微改下代码即可. 3.实现两路ADC连续转换,两路ADC转换:一路是检测锂电池电压:一路是检测压力传感器,其实都是检测电压,当检测到压力为零,并累计多长时间后进

GPIO模拟I2C

之前在学习I2C驱动,想了想应该先深刻理解下I2C协议.个人觉得理解I2C协议最好的方法就是实践,而最好的实践方式就是用GPIO来模拟I2C协议进行试验,直观深刻. 先看下I2C时序图: 根据时序图,用两个gpio分别模拟sda和scl即可.在这之前自然需要先对gpio进行输入输出的配置.这里只从写数据角度来描述这一过程.读数据同理即知. 先配置gpio,包括sda.scl.供电gpio等额外功能gpio. gpio_config(GPIO_SDA, GPIO_OUTPUT); gpio_con

使用软件模拟spi 时序时注意点

软件模拟 spi 时序有以下几个点需要注意: cs 使能后到第一个 sck 边沿需要延时. 最后一个sck 边沿到下一个 cs 需要延时. sck 的高电平和低电平本身需要维持时间. mosi 需要先把数据放上去,然后启动上升沿,然后延时 sck 高电平的时间. 在延时了 sck 高电平的时间后,读取 miso 的电平,然后启动下降沿,然后延时 sck 低电平的时间. 原文地址:https://www.cnblogs.com/ramlife/p/11743022.html

【转载】GPIO模拟i2c通信

I2C总线的通信过程(见图4-8)主要包含三个主要阶段:起始阶段.数据传输阶段和终止阶段. 1. 起始阶段 在I2C总线不工作的情况下,SDA(数据线)和SCL(时钟线)上的信号均为高电平.如果此时主机需要发起新的通信请求,那么需要首先通过SDA和SCL发出起始标志.当SCL为高电平时,SDA电平从高变低,这一变化表示完成了通信的起始条件. 在起始条件和数据通信之间,通常会有延时要求,具体的指标会在设备厂商的规格说明书中给出. 2. 数据传输阶段 I2C总线的数据通信是以字节(8位)作为基本单位