IO口模拟SPI口
基于MSP430的模拟SPI串口通信的实现
基于MSP430的模拟SPI串口通信的实现MSP430是德州仪器(Texas Instruments)公司生产的一款微控制器,内置有模拟外设接口和数字外设接口,非常适合用于嵌入式系统的开发。SPI(Serial Peripheral Interface)是一种同步串行通信协议,常用于
微控制器之间的通信。
在基于MSP430的模拟SPI串口通信实现中,我们需要使用MSP430的GPIO(General-Purpose Input/Output)外设模拟SPI通信协议的时序。
以下是基于MSP430的模拟SPI串口通信实现的步骤:
1.配置MSP430的GPIO口为输出模式,并将片选信号(CS)、时钟信
号(CLK)、主设备输入信号(MISO)设置为低电平,主设备输出信号(MOSI)设置为高电平。
2.配置MSP430的GPIO口中的片选信号(CS)为输出模式,并将其设
置为高电平。
3.编写SPI通信的初始化函数,设置SPI的参数,如时钟分频比、数
据位长度等。
4.实现SPI通信的发送函数。将待发送的数据放入发送缓冲区,按照SPI通信协议的时序,通过MSP430的GPIO口将数据逐位发送出去。
5.实现SPI通信的接收函数。按照SPI通信协议的时序,通过
MSP430的GPIO口接收从外设传入的数据,并存储到接收缓冲区。
6.实现SPI通信的片选控制函数。控制片选信号的输出,使得与其他
外设通信时只选中对应的外设。
7.在主函数中调用上述SPI通信的功能函数,进行数据的发送和接收。
需要注意的是,以上步骤仅是基于MSP430的模拟SPI串口通信实现的一般步骤,具体的实现细节还需根据具体的硬件设备和通信协议来进行调整。
使用MCU的GPIO模拟SPI
使用MCU的GPIO模拟SPI
在树莓派等单片机(MCU)上,可以使用GPIO模拟SPI(串行外设接口)来与其他设备进行通信。SPI是一种同步串行数据传输协议,通常用
于连接MCU和传感器、显示器、存储器等外设。以下是使用MCU的GPIO
模拟SPI的详细步骤。
1.了解SPI的基本原理:SPI使用四根信号线进行通信,包括时钟(SCLK)、主机输出从机输入(MOSI)、主机输入从机输出(MISO)和片
选(SS)。
-SCLK:时钟信号,由主机产生,用于同步数据传输。
-MOSI:主机输出从机输入,主机将数据发送到从机。
-MISO:主机输入从机输出,从机将数据发送到主机。
-SS:片选信号,用于选择从机。
2.确定所需GPIO引脚:根据所连接的设备的要求,选择合适的GPIO
引脚作为SCLK、MOSI、MISO和SS。
3. 配置GPIO引脚:在MCU上,使用相应的编程语言和库函数来配置GPIO引脚。例如,在树莓派上使用Python编程,可以使用RPi.GPIO库
进行配置。
4.编写SPI传输函数:编写一个函数来模拟SPI传输。该函数应包括
以下步骤:
a.设置SS为低电平,选中从机设备。
b.发送数据比特串:逐位发送MOSI数据,同时接收并保存MISO数据。
c.设置SS为高电平,取消从机设备的选中。
假设我们要发送8位数据,可以使用以下Python代码实现SPI传输函数:
```python
import RPi.GPIO as GPIO
def spi_transfer(data):
GPIO.output(SS, GPIO.LOW) # 选中从机
RT-Thread记录(十五、IO 设备模型之SPI设备)
•前言
•一、SPI 通讯基础
•二、SPI 设备操作函数
▪ 2.1 挂载SPI 设备
▪ 2.2 配置SPI 设备
▪ 2.3 访问SPI设备
•三、SPI 设备测试
▪ 3.1 SPI 设备使用步骤
▪ 3.2 测试
•结语
前言
本文应该是RT-Thread I/O 设备模型最后一篇,SPI 设备的学习测试。
一、SPI 通讯基础
SPI 通讯基本知识不过多介绍,原理与基础可自行网上查询,本文这里只做应用所需的简单概述:
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,SPI 的通讯速度可以达到几十M,并且在芯片的管脚上只占用四根线:
(1)MISO– Master Input Slave Output,主设备数据输入,从设备数据输出;
(2)MOSI– Master Output Slave Input,主设备数据输出,从设备数据输入;
(3)SCLK – Serial Clock,时钟信号,由主设备产生;(4)CS – Chip Select,从设备使能信号,由主设备控制。
在这里插入图片描述
SPI 以主从方式工作,通常有一个主设备和一个或多个从设备。
SPI 通讯有4中模式,由 CPOL (时钟的极性)和CPHA (时钟的相位)决定:
CPOL=0,表示当SCLK=0时处于空闲态,空闲低电平,所以有效状态就是SCLK处于高电平时CPOL=1,表示当SCLK=1时处于空闲态,空闲高电平,所以有效状态就是SCLK处于低电平时CPHA=0,表示数据采样是在第1个边沿CPHA=1,表示数据采样是在第2个边沿
运用4个普通IO口模拟SPI程序等
for( j=0;j<24;j++)
{Leabharlann Baidu
ATT_SCLK=1; //送时钟
if((DAT>>j) & 0x01) {ATT_Din=1;}
else
{ATT_Din=0;}
ATT_SCLK=0; //送时钟
}
ATT_CS=1;
#asm("sei")
}
}
/************************************************************
钟。读也是一样,
积分:416
写应该是 时钟——〉写数据——〉延时——〉时
派别:
钟。你延时的位置有点不对,另外,发送地址之后为什么要等那
等级:------ 么长时间?
来自:
我只看了读的程序。
2006-11-0 资料 邮件 7,11:06:53
【2 楼】 gan 我这里有 PIC18F6520 的程序你看看:
从设备,如
没有 CS 信号,则只能存在一个从设备,主设备通过产生移
位时钟来发起通讯。
在 SPI 传输中,数据是同步进行发送和接收的。数据传输的时钟基于 来自主处理器的时钟脉冲,摩托罗拉没有定义任何通用 SPI 的时钟规范。然而, 最常用的时钟设置基于时钟极性(CPOL)和时钟相位(CPHA)两个参数,CPOL 定 义 SPI 串行时钟的活动状态,而 CPHA 定义相对于 SO-数据位的时钟相位。CPOL 和 CPHA 的设置决定了数据取样的时钟.
单片机IO口介绍
单片机IO口介绍
单片机(microcontroller)是一种集成电路芯片,具有运算、存储
和控制功能。它是嵌入式系统中最常用的处理器之一、在单片机中,IO (Input/Output)口是用来进行输入输出操作的接口。IO口通常包括数
字IO口和模拟IO口两种类型。下面将详细介绍单片机IO口的功能和应用。
1.数字IO口:
数字IO口是单片机与外部设备进行数字信号交换的接口。数字IO口
可以进行输入和输出操作,具有以下特点:
-输入功能:可以通过读取外部设备的状态或信号,并将其转换为数
字信号输入到单片机中进行处理。例如,传感器的信号输入和按键的输入等。
-输出功能:可以通过将数字信号输出到外部设备,控制其工作状态。例如,LED的控制、驱动电机或继电器等。
数字IO口通常以引脚(pin)的形式存在于单片机芯片上。一个引脚
包括输入端和输出端,可以根据需要进行配置。数字IO口操作简单、速
度快、精度高,常用于控制和通信等方面。
2.模拟IO口:
模拟IO口是单片机与外部设备进行模拟信号交换的接口。模拟IO口
可以进行模拟输入和输出操作,常用于采集和控制模拟信号。
-模拟输入功能:可以从外部信号源中获取模拟信号,并将其转换为
数字信号输入到单片机中进行处理。例如,温度传感器、声音传感器等。
-模拟输出功能:可以将数字信号转换为模拟电压、电流等形式,输
出到外部设备中。例如,通过PWM(脉冲宽度调制)信号控制电机的转速。
模拟IO口通常通过ADC(模数转换器)和DAC(数模转换器)实现。ADC将模拟信号转换为数字信号,DAC将数字信号转换为模拟信号。模拟
单片机IO口模拟SPI四种模式的程序
单⽚机IO⼝模拟SPI四种模式的程序#include "iom8535v.h"
#define _CPOL 1
#define _CPHA 0
#define SCK_IO DDRA|=0X01
#define MOSI_IO DDRA|=0X02
#define MISO_IO DDRA&=0XFB
#define SSEL_IO DDRA|=0X08
#define SCK_D(X) (X?(PORTA|=0X01):(PORTA&=0XFE))
#define MOSI_D(X) (X?(PORTA|=0X02):(PORTA&=0XFD))
#define SSEL_D(X) (X?(PORTA|=0X08):(PORTA&=0XF7))
#define MISO_I() (PINA&0X04)
void delay()
{
unsigned char m,n;
for(n=0;n<5;n++);
for(m=0;m<100;m++);
}
void SPI_Init(void)
{
SCK_IO ;
MOSI_IO ;
MISO_IO ;
SSEL_IO ;
SSEL_D(1);
MOSI_D(1);
#if _CPOL==0
SCK_D(0);
#else
SCK_D(1);
#endif
}
#if _CPOL==0&&_CPHA==0 //MODE 0 0
void SPI_Send_Dat(unsigned char dat)
{
unsigned char n;
for(n=0;n<8;n++)
{
SCK_D(0);
MCU的GPIO模拟SPI源代码汇总
MCU的GPIO模拟SPI源代码
写程序:
void SPIx_WriteByte(u8 TxData
{
u8 j=0;
SPI_FLASH_CLK_LOW(; //clk=0
if(TxData&0x80
{SPI_FLASH_DI_HIGH(;} //mosi=1
else
{SPI_FLASH_DI_LOW(;} //mosi=0
for(j=0;j<3;j++; //延时
SPI_FLASH_CLK_HIGH(; //clk=1,一个上升沿写入一位for(j=0;j<5;j++; //延时
SPI_FLASH_CLK_LOW(; //clk=0
if(TxData & 0x40
{SPI_FLASH_DI_HIGH(;} //mosi=1
else
{SPI_FLASH_DI_LOW(;} //mosi=0
for(j=0;j<3;j++; //延时
SPI_FLASH_CLK_HIGH(;
for(j=0;j<5;j++;
SPI_FLASH_CLK_LOW(;
if(TxData&0x20
{SPI_FLASH_DI_HIGH(;} //mosi=1 else
{SPI_FLASH_DI_LOW(;} //mosi=0 for(j=0;j<3;j++; //延时SPI_FLASH_CLK_HIGH(;
for(j=0;j<5;j++;
SPI_FLASH_CLK_LOW(;
if(TxData&0x10
{SPI_FLASH_DI_HIGH(;} //mosi=1 else
{SPI_FLASH_DI_LOW(;} //mosi=0 for(j=0;j<3;j++; //延时SPI_FLASH_CLK_HIGH(;
SPI、I2C、UART三种串行总线协议的区别和SPI接口介绍(转)
SPI、I2C、UART三种串⾏总线协议的区别和SPI接⼝介绍(转)SPI、I2C、UART三种串⾏总线协议的区别
第⼀个区别当然是名字:
SPI(Serial Peripheral Interface:串⾏外设接⼝);
I2C(INTER IC BUS)
UART(Universal Asynchronous Receiver Transmitter:通⽤异步收发器)
第⼆,区别在电⽓信号线上:
SPI总线由三条信号线组成:串⾏时钟(SCLK)、串⾏数据输出(SDO)、串⾏数据输⼊(SDI)。SPI总线可以实现多个SPI设备互相连接。提供SPI串⾏时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从机或从设备(Slave)。主从设备间可以实现全双⼯通信,当有多个从设备时,还可以增加⼀条从设备选择线。
如果⽤通⽤IO⼝模拟SPI总线,必须要有⼀个输出⼝(SDO),⼀个输⼊⼝(SDI),另⼀个⼝则视实现的设备类型⽽定,如果要实现主从设备,则需输⼊输出⼝,若只实现主设备,则需输出⼝即可,若只实现从设备,则只需输⼊⼝即可。
I2C总线是双向、两线(SCL、SDA)、串⾏、多主控(multi-master)接⼝标准,具有总线仲裁机制,⾮常适合在器件之间进⾏近距离、⾮经常性的数据通信。在它的协议体系中,传输数据时都会带上⽬的设备的设备地址,因此可以实现设备组⽹。
如果⽤通⽤IO⼝模拟I2C总线,并实现双向传输,则需⼀个输⼊输出⼝(SDA),另外还需⼀个输出⼝(SCL)。(注:I2C资料了解得⽐较少,这⾥的描述可能很不完备)
IO口模拟SPI主从机例程
IO口模拟spi主从机通讯例程
下面这两幅图是,关于SPI数据读取或发送的时序图。
1、主机io口模拟spi通讯例程
//**spi io 口初始化**//
void SPI_init(void)
{
gpio_configure_fpin(SPI_MISO, IO_TYPE_INPUT);//配置成输入模式gpio_configure_fpin(SPI_MOSI, IO_OUTPUT_1);//配置成输出模式gpio_configure_fpin(SPI_SCK, IO_OUTPUT_1); //配置成输出模式
gpio_configure_fpin(SPI_CS, IO_OUTPUT_1); //配置成输出模式
clr_spi_GPIO(SPI_SCK);//拉低SPI_SCK
set_spi_GPIO(SPI_CS);//拉高SPI_SCK
clr_spi_GPIO(SPI_MOSI);//拉低SPI_MOSI
}
//**主机spi读取一字节api**//
unsigned char SPI_ReadByte(void){
unsigned char i,rByte=0;
clr_spi_GPIO(SPI_CS);
for(i=0;i<8;i++){
clr_spi_GPIO(SPI_SCK);//clr_spi_sck;
delay_us(3);
rByte<<=1;
if(MISO_is_status())//
//M16 MISO---PB6
rByte|=1;
set_spi_GPIO(SPI_SCK);//set_spi_sck;
IO口模拟SPI接口
IO口模拟SPI接口
//头文件
#include
#include
/*********************************************
模拟SPI接口I/O定义
*********************************************/
sbit CS =P3^2; //片选信号 (输入)
sbit SCK =P3^3; //时钟信号 (输入)
sbit MISO=P3^4; //主站输入从站输出 (输出)
sbit MOSI=P3^5; //主站输出从站输入 (输入)
#define SET_CS() CS=1 //片选信号置高
#define RESET_CS() CS=0 //片选信号置低
#define SET_SCK() SCK=1 //时钟信号置高
#define RESET_SCK() SCK=0 //时钟信号置低
//自定义变量
unsigned char spi_flag=0,SPI_Data=0;
//自定义函数
extern void Usart_Send(unsigned char Data);
/************************************************************** **********
程序描述:系统初始化程序
*************************************************************** ****************/
void System_Init()
STM32之IO口模拟SPI
STM32之IO⼝模拟SPI
本⽂介绍如何使⽤STM32标准外设库的GPIO端⼝模拟SPI,本例程使⽤PA5、PA6和PA7模拟⼀路SPI。SPI有4种⼯作模式,模拟SPI使⽤模式0,即空闲时SCK为低电平,在奇数边沿采样。
本⽂适合对单⽚机及C语⾔有⼀定基础的开发⼈员阅读,MCU使⽤STM32F103VE系列。
1. 简介
SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串⾏外围设备接⼝,是⼀种⾼速全双⼯的通信总线。它被⼴泛地使⽤在要求通讯速率较⾼的场合。SPI⽤于多设备之间通讯,分为主机Master和从机Slave,主机只有⼀个,从机可以有多个,通过⽚选信号对从机进⾏选择,⼀次只能选择⼀个从机。通讯只能由主机发起,⽀持的操作分为读取和写⼊,即主机读取从机的数据,以及向从机写⼊数据。
SPI⼀般有4根线,分别是⽚选线SS、时钟线SCK、主设备输出\从设备输⼊MOSI、主设备输⼊\从设备输出MISO,其中除MISO对于主机为输⼊引脚外,其他引脚对于主机均为输出引脚。因为有独⽴的输⼊和输出引脚,因此SPI⽀持全双⼯⼯作模式,即可以同时接收和发送。2. 总线传输信号
空闲状态:⽚选信号SS低电平有效,那么空闲状态⽚选信号SS为⾼。
开始信号及结束信号:开始信号需要将⽚选信号SS拉低,结束信号需要将⽚选信号SS拉⾼。
通讯模式:SPI有4种通讯模式,分别为0、1、2、3,根据时钟极性和时钟相位确定,时钟极性分别为空闲低电平和空闲⾼电平,时钟相位分别为SCK奇数边沿采样和偶数边沿采样。常⽤的模式为模式0和模式3。
基于单片机I/O口模拟的SPI串行通信实现
基于单片机I/O口模拟的SPI串行通信实现
【摘要】基于单片机或ARM芯片的普通I/O口,模拟实现SPI串行通信。模拟SPI通信需严格时钟时序,只有当主器件模拟的SPI时序与从器件的SPI时序完全一致时,才能实现SPI通信的正常数据交换。
【关键词】I/O口;SPI时序;主器件;从器件
1.引言
SPI(SeIial Peripheral Interfa即串行外围设备接口)总线技术是一种高效率的串行接口技术,主要用于扩展外设和进行数据交换。在许多单片机中,已经作为一种标准配置。但某些应用非常广泛的单片机并不带标准SPI接口,这样就限制了在这些系统中使用带SPI接口的器件。解决该问题的方法是使用单片机的普通I/O口通过软件模拟的方式实现SPI串口通信,以满足应用需求。此外,采用标准的SPI接口有很多局限性,在设备外围开发和扩展增加负担,而通过I/O口模拟实现SPI通信将不受这些限制,可轻松实现其外围开发和扩展,灵活性更大;通过I/O口模拟SPI通信,其通用性和可移植性强,实现简单、方便。
2.SPI总线概述
SPI通信的总线形式一般采用4线制,即为使能控制线SN、始终控制线SCLK、主出从入线MOSI和主入从出线MISO。可实现一个主控制器挂接多个从控制器,如图1所示,为SPI总线框图。
使能控制线SN完成对从控制器的片选,当需要与某个控制通信时,将SN 置于打开(高或者低,根据不同芯片分别对待)状态,使从控制器处于可通信状态,同时时钟控制线SCLK用于控制SPI通信的时序,该时序需与从控制器的SPI时序保持完全一致,这样才能保证SPI通信的实现。主出从入线MOSI为SPI 串口通信数据输出线,主入从出线MISO为SPI串口通信数据输入线。
运用4个普通IO口模拟SPI程序等.
/******************************************************************** 函 数 名:uchar SpiReadWrite(uchar dat) 功 说 调 能:SPI 发送接收一个数据 明: 用:
2、SPI 简百度文库: 同步外设接口(SPI)是由摩托罗拉公司开发的全双工同步串行总线,该总线大量 用在与 EEPROM、ADC、FLASH 和显示驱动器之类的慢速外设器件通信。 SPI(Serial Peripheral Interface)是一种串行同步通讯协议,由一个主设 备和一个或多个从设备组成, 主设备启动一个与从设备的同步通讯,从而完成数 据的交换。通讯时,数据由 MOSI 输出,MISO 输入,数据在时钟的上升或下 降沿由 MOSI 输出, 在紧接着的下降或上升沿由 MISO 读入, 这样经过 8/16 次 时钟的改变,完成 8/16 位数据的传输。
入口参数: 出口参数: ***********************************************************************/ uchar SpiReadWrite(uchar dat) { uchar i,temp; temp=0; SCK=0; _nop_(); for(i=0;i<8;i++) { if(dat & 0x80) { MOSI=1; }
I/OPort软件模拟三线SPI通信时序
Ab ta t P sa h g — p e sr c :S I i i h s e d,f l d p e u l u lx,s n h o o s s ra o mu i a i n i t ra e Be a s — y c r n u e i lc m nc t n e fc . o cu e
Ke r s PI / P r ;MCU ;f l d pe ywo d :S ;I O o t u l u lx;s n h o ia in;tmi g — y c r nz to i n
S I S r lpr h rl nef e P ( ei ei ea itr c—— 串 行 设 备 接 a p a 口) 是摩托 罗拉 公 司推 出 的一种 同步 串行通 信 接 口,
of is e t e t f a urຫໍສະໝຸດ Baidu of a e o e s t Us e,mo e nd r a mor p rph r l h ps nt gr t t s o e e i e a c i i e a e hi c mm u c ton nia i pr o o .H o ve ot c 1 we r,i a tc n pr c ie,a c nsde a l a to CU swih no SPIi e f c l i ie o i r b e p r fM t nt r a ewi1be l t d m i he us i n t e n SPI us d v c . I c nsde i f t r b e i e n o i rng o he p odu t ie, c t a s a a lt d sgn r c sz os nd c l biiy, e i e s wou d lke us CU t o SPI i e f c o o r lt x e n lde i e wih SPI i e f c . I l i e M wih n nt ra e t c nt o he e t r a v c t nt r a e n
IO模拟SPI时序
模块积累:IO模拟SPI时序 2011-05-19 18:21:09| 分类: 嵌入式开发 | 标签: |举报 |字号大中小 订阅 SPI是摩托罗拉提出一种比较总线结构,比飞利浦公司提出的IIC总线多出两条线,这两种总线结构都因为占用IO口少而得到了广泛的使用,一般来说,SPI总线与IIC总线都可以用IO模拟,也有相当多的芯片里面集成了IIC与SPI,比如STC12C60S2中就集成了SPI接口。这里就用模拟SPI来进行通信吧!!!!程序从一个仿真论坛里面弄来,主要是想积累一个SPI驱动以及了解一下如何根据芯片的时序图来写程序。当然也可以练一下英语,因为那可恶的数据手册全是英文的!!!!/*********************************************************************************************程序名: 编写人: 李聪 编写时间: 20 年 月 日硬件支持: 接口说明: 修改日志: NO.1- /*********************************************************************************************说明: 一个完整的模拟SPI接口设计 ,单片机与微芯公司25AA020AEEPROM以SPI接口进行通信 从时序图可知:在写一个字节的时候,先写允许,再写指令,再写地址,再写数据,再判断数据是否被传送。在读一个字节的时候,先写指令,再写地址,接着就可以读出该字节了。/*********************************************************************************************/#include #include#define uchar unsigned char#define uint unsigned int/*********************************************************************************************/sbit SCK=P2^0; //时钟 sbit SI=P2^2; //单片机的输入,接芯片的SO,因此为输入sbit SO=P2^1; //单片机的输出,接芯片的SIsbit CS=P2^3; //使能片选 ,接芯片的CSuchar count,sum;/*********************************************************************************************/void delay(uint a) //延时 {while(a--);}/**********************SPI驱动程序,用IO模拟**************************************************/void write(uchar dat) //写一个字节{uchar i=0;SI=1;for(i=0;i<8;i++) //8位数据串行输出 {SCK=0; //时钟 低电平 SO=( dat&0x80 ); //a&0x80=0,则S0=0。a&0x80!=0,则S0=1。dat=dat<<1; //a左移一位,为下一次输出做准备 SCK=1; //时钟上升沿 , 存储器读电平 delay(5); //延时一小会 }}uchar read(void) //读一个字节{uchar a=0;uchar i;for(i=0;i<8;i++){SCK=0; //时钟 低电平 delay(5); //延时一小会 a=a<<1; //a左移一位,腾出最低位SCK=1; //时钟上升沿 ,单片
GPIO模拟SPI通讯接口的驱动
GPIO模拟SPI通讯接口的驱动
一,某些时候我们会不得不使用GPIO来模拟SPI,I2C等通讯接口,如本例中,需要使用SPI接口发送9位的数据,如果使用linux内核提供的SPI子系统来做这个驱动是无法实现9位传输数据的。
二,用GPIO模拟SPI总的来说是比较简单,把相应的管脚配置成GPIO功能,再按需要配置管脚的输入输出方向,然后根据SPI总线的时序设定IO口的电平。
三,驱动代码如下,以备今后作参考:
(linux-2.6.28 + TCC8900, 这个驱动是用来控制LCD的初始化的(型号为LW350AC9001))
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PDEBUG
#ifdef PDEBUG
#define PLOG(fmt,args...) printk(fmt,##args)
#else
#define PLOG(fmt,args...) /*do nothing*/
#endif
#define SPI_CMD 0
#define SPI_DATA 1
#define FUN_GPIO 0
#define PIN_SDO 15 //GPIOF[15]
#define PIN_SDI 14
#define PIN_SCLK 16
#define PIN_CS 29 //GPIOC[29]
#define GPC_BASE 0xF0102080
#define GPF_BASE 0xF0102140
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
模块名称:spi.h
模块说明: c51单片机的i/o模拟spi操作
创建时间: 2005/03/09
创建者: xichen
******************************************************************************* */
#ifndef SPI_H
#define SPI_H
sbit SPIS_N = P2^1;
sbit SPIC = P2^3;
sbit SPID = P2^2;
sbit SPIQ = P2^4;
extern void spi_reset();
extern void spi_write(unsigned char spi_bValue);
extern unsigned char spi_read();
#endif
/****************************************************************************** *
模块名称:spi.c
模块说明: c51单片机的i/o模拟spi操作
创建时间: 2005/03/09
创建者: xichen
******************************************************************************* */
#include "includes.h"
#define set_spi_cs() SPIS_N =1
#define clr_spi_cs() SPIS_N =0
#define set_spi_clk() SPIC =1
#define clr_spi_clk() SPIC =0
#define set_spi_di() SPID =1
#define clr_spi_di() SPID =0
#define read_spi_do() SPIQ
//------------------------------------------ void spi_reset()
{
set_spi_cs();
}
//----------------------------------------- void spi_write(unsigned char spi_bValue) {
unsigned char no;
clr_spi_cs();
for (no=0;no<8;no++)
{
clr_spi_clk();
if ((spi_bValue &0x80)==0x80)
set_spi_di();
else
clr_spi_di();
set_spi_clk();
spi_bValue = (spi_bValue <<1);
}
}
//---------------------------------------------- unsigned char spi_read()
{
unsigned char no,spi_bValue;
clr_spi_cs();
for (no=0;no<8;no++)
{
clr_spi_clk();
spi_bValue = (spi_bValue <<1);
set_spi_clk();
if (read_spi_do() ==1)
spi_bValue |=0x01;
else
spi_bValue &=~0x01;
}
return spi_bValue; }