本章节将浅析SPI通信原理,以及利用MC9S08DZ60单片机的串行外围设备接口SPI,实现SPI串行通信,MCU为主控设备。有兴趣的读者可以通过单片机的I/O口,模拟SPI通信过程,实现SPI通信。

1.理解SPI通信协议

读者可以到网盘https://pan.baidu.com/s/1yEoRjek9Oag5iEpp40nYYQ下载<SPI协议及工作原理分析>,该文章是作者在百度文库找到,并提取下来的,文中附有当时的下载地址。转发请注意注明转载出处。

这篇文章很简洁的介绍了SPI通信协议和工作原理,初识SPI通信的读者请认真阅读。

作者在此简短说明SPI通信原理。

如下图,主设备(Master)要发送0x66给从设备(Slave),同时从设备(Slave)也会把0xC5发送给主设备(Master);

每个CLKx周期,主从设备做了一个bit位的数据交换,数据交换为byte单位,需要循坏8CLK周期。

从而分析出SPI具备的几个特点:

主从模式(Master->Slave):主设备是主控制设备,控制从设备的选取和时钟驱动。

同步方式(synchronize):根据时钟信号同步数据的收发。

交换数据方式(exchange):在每个时钟周期CLK内,主从SPI设备都会发送并接受一个bit大小的数据。

2.SPI工作方式

如下图:

先往 Master 的 Tx-Data 寄存器写入将要发送出去的数据(有时为了读取从设备可以发送dummy数据), 这些数据会被 Master-SSPSR 移位寄存器根据 Bus-Width 自动移入 Master-SSPBUF 里, 然后这些数据又会被 Master-SSPSR 根据 Channel-Width 从 Master-SSPBUF 中移出, 通过 Master-SDO  管脚传给 Slave-SDI 管脚,  Slave-SSPSR 则把从  Slave-SDI 接收到的数据移入 Slave-SSPBUF 里.  与此同时, Slave-SSPBUF 里面的数据根据每次接收数据的大小(Channel-Width), 通过 Slave-SDO 发往 Master-SDI, Master-SSPSR 再把从 Master-SDI 接收的数据移入 Master-SSPBUF.在单次数据传输完成之后, 用户程序可以通过从 Master 设备的 Rx-Data 寄存器读取 Master 设备数据交换得到的数据.

Bus-Width :即上图寄存器Tx_Data到SSPBUF总线位宽。

Channel-Width:即上图SDO->SDI的数据带宽,也可以理解为主设备到从设备或从设备到主设备每次发送的数据宽度,一般是一个字节。

3.阅读芯片资料理解MC9S08DZ60的SPI

大家可以到百度网盘下载该芯片的中英文的资料https://pan.baidu.com/s/1dgVbkE https://pan.baidu.com/s/1o9qFU5c

进入第十三章 串行外围接口SPI(Serial peripheral Interface)

a.从Figure 13-1. MC9S08DZ60 Block Diagram节中,加黑部分总览SPI模块及其接口。该芯片中提供一路SPI接口,接口还将占用端口E的4个I/O口。

b. 13.1.1 Features节中特性 目前普遍拥有SPI通信模块芯片的基本特性,这里说明下MSB和LSB。

最高有效位(MSB),指二进制中代表最高值的比特位,这一位对数值的影响最大。例如,在二进制的1001(十进制的9)  中,最左边的“1”对数值影响最大:1到9的变化幅度。而最右边的1仅会让数值产生8到9的变化,故该位称也为最低有效位LSB(Least Significant Bit)。

如果设置为MSB发送模式,那么一个byte数据在从SDO->SDI过程,是先发送最左边的bit位,如果是LSB,那么相反。这里还有个概念,叫着大小端。在嵌入式网络开发中,经常提到。有兴趣的读者可以通过互联网搜索等方式,了解这个大小端的概念。

c. 13.1.2.2 SPI Module Block Diagram 这里面讲了很多(芯片资料建议看英文的,中文部分有误),最简单的就理解这句话就行“In the external SPI system, simply connect all SPSCK pins to each other, all MISO pins together MOSI pins together. Peripheral devices often use slightly different names for these pins.”在硬件层面,主从设备把相同名字的接口连接即可。至于SPI模块内部的route(接收或发送的线路选择),能理解就理解。

d.  13.1.3 SPI Baud Rate Generation 这小节介绍了Baud波特率的时钟源,看下图,时钟源来源于BUS CLOCK总线时钟,在本系列博文中《第二课 MC9S08DZ60之多功能时钟发生器S08MCGV1》有介绍,且该单片机的SPI时钟源只能来源于总线时钟。BUS CLOCK时钟来源于MCGOUT的时钟,且BUS CLOCK为MCGOUT时钟的一半。这里将利用《第二课 MC9S08DZ60之多功能时钟发生器S08MCGV1》中代码设置好的时钟作为SPI的驱动时钟。其中MCGOUT为40mHz,那么BUS CLOCK就是20mHz。

总线时钟BUS CLOCK经过预分频PRESCALER和时钟速率除数CLOCK RATE DIVIDER,最终才得到SPI的驱动时钟。波特率一般用位每秒(bit/s)作为单位,通俗的理解就是:一秒钟能发送多少位。举个例子:假如分频后SPI的驱动时钟为T=1ms(1kHz),那么波特率为baud=1000bps————一秒钟可以传输1000bit的数据。

e. 13.2.2 MOSI — Master Data Out, Slave Data In和13.2.3 MISO — Master Data In, Slave Data Out两小节,除了介绍了标准4线模式的SPI通信,还介绍了single-line bidirectional Mode(一根数据线,主master到从slave间的双向通信模式),在这种模式下,只需要时钟线SCK、片选线CS/SS和一根数据线SD,即可完成SPI主从的硬件连接。这将节省一路I/O管脚,节省的管脚分别为主设备的MISO和从设备的MOSI,而原来主设备的MOSI更名为MOMI,原来从设备的MISO更名为SISO.(芯片资料建议看英文,中文有错误)。

f.  13.2.4 SS — Slave Select 这小节介绍了SS片选管脚,读者要了解,当从设备只有一个,不需要片选的时候,主设备的SS管脚是可以空出来做为通用I/O口的(在硬件上面还需要配合)。

g.  13.5 Functional Description 这小节讲了MC9S08DZ60 MCU提供的一些SPI功能模块的特性,其中 的故障模式(SS管脚配置为故障检测口)“The mode fault detection feature can be used in a system where more than one SPI device might become a master at the same time. ”用于在多个SPI设备间的主从权衡。在一些应用场合,这些SPI设备既可以为主模块去寻址其它设备,又可以为从模块而被寻址。当为主SPI模块的设备被寻址,那么模式错误会被置起。置起的故障可以通过设置一个终端服务进行处理。

h.  13.6 Initialization/Application Information 这小节提供了 SPI初始化过程和一个伪例子。这里把资料中的Initial sequence 初始化过程的文字拷贝过来:

1. Update control register 1 (SPIC1) to enable the SPI and to control interrupt enables. This register
               also sets the SPI as master or slave, determines clock phase and polarity, and configures the main

SPI options.

SPIC1寄存器控制SPI模块的使能和中断的使能,同时SPI从从模式的选择、时钟相位CPHA、时钟记性CPOL和主要的                  SPI选项也有SPIC1寄存器来设置

2. Update control register 2 (SPIC2) to enable additional SPI functions such as the master mode-fault

function and bidirectional mode output. Other optional SPI functions are configured here as well.

SPI的额外功能有SPIC2寄存器来设置,例如模式错误功能和单线双向通信功能。其他附加的SPI功能也在此寄存器设                   置。

3. Update the baud rate register (SPIBR) to set the prescaler and bit rate divisor for an SPI master.

预分配和速率除数计算的波特率在寄存器SPIBR中设置。

3.代码实现

本代码提供初始化和设置SPI功能的函数,并提供一个轮询方式的SPI访问实例。总线BUS CLK为20mHz。时钟设置采用《第二课 MC9S08DZ60之多功能时钟发生器S08MCGV1》设置好的。

头文件.H

#ifndef _DATA_TYPE_H_H
#define _DATA_TYPE_H_Htypedef char            INT8;
typedef unsigned char   UINT8;
typedef unsigned short  USHORT16;
typedef unsigned int    UNIT16;
typedef unsigned long   ULONG32;
typedef short           SHORT16;
typedef long            LONG32;
typedef unsigned char   BOOL;
#endif
#ifndef _SPI_H_H_
#define _SPI_H_H_//SPI Control Register1--------------------------------------------------------
/*| 7   | 6  |  5   |  4  |  3  |  2  | 1   |0    |
R    |-----------------------------------------------||SPIE |SPE |SPTIE |MSTR |CPOL |CPHA |SSOE |LSBFE|
W    |-----------------------------------------------|
Reset| 0   | 0  |  0   |  0  |  0  |  1  |  0  |0    |
*/
#define SPIC1_RESET 0x04   //reset value
//Table_1
#define RESET_SPIC1   0xAA
#define SPI_INTERRUPT_ENABLE 7     //When SPRF or MODF is 1,request HW INTR.
#define SPI_INTERRUPT_DISABLE (~7) //use polling
#define SPI_ACTIVE     6           //SPI system enabled
#define SPI_INACTIVE (~6)          //SPI system inactive
#define SPI_TX_INTERRUPT_ENABLE  5 //When SPTER is 1,hardware interrupt reqested.
#define SPI_TX_INTERRUPT_DISABLE (~5)//use polling
#define SPI_AS_MASTER 4            //SPI mode configured as a MASTER.
#define SPI_AS_SLAVE  (~4)         //SPI mode configured as a SLAVE.
#define SPI_CLK_IDLES_HIGH  3      //Active-low SPI clock
#define SPI_CLK_IDLES_LOW (~3)     //Active-high SPI clock
#define SPI_DATA_CHANGE_0N_FALLING_EDGE  2   //First edge on SPSCLK at the start.
#define SPI_DATA_CHANGE_ON_RISING_EDGE   (~2)//First edge on SPSCK occurs at the middle.
#define SPI_SSOE_SET_ONE  1 //use to set SS pin Function
#define SPI_SSOE_SET_ONE_REVERSE ~1 //use to set SS pin Function
#define SPI_LSB_DATA_FLOW 0  //LSB Transfer mode
#define SPI_MSB_DATA_FLOW ~0   //MSB Transfer mode
/*
Update control register 1 (SPIC1) to enable the SPI and to control interrupt
enables. This register also sets the SPI as master or slave, determines clock
phase and polarity, and configures the main SPI options.
Parameter FuncValue为Table_1中的值。
*/
void SetSPICtrlRegister1(UINT8 FuncValue);//SPI Control Register2--------------------------------------------------------
/*7 6  5     4       3      2    1      0--------------------------------------------
R    |0 |0 |0 |       |       |  0 |       |    ||--|--|--|MODFEN |BIDIROE|----|SPISWAI|SPC0|| N|N |N |       |       |  N |       |    |--------------------------------------------
Reset| 0| 0| 0|   0   |   0   |  0 |  0    | 0  |*/
#define SPIC2_RESET 0x00 //reset value
//Table_2
#define RESET_SPIC2 0xAA  //Reset command
#define MODE_FAULT_ENABLE 4//Mode fault function enabled,master SS pin acts as //the mode fault input or the slave select output.
#define MODE_FAULT_DISABLE (~4)//Mode fault function disabled,master SS pin reverts//to general-purpose I/O not controlled by SPI.
#define DATA_IO_AS_OUTPUT  3 //SPI I/O pin enabled as an output
#define DATA_IO_AS_INPUT   ~3 //Output driver disabled so SPI data I/Opin act as input.#define SPI_CLK_STOP_IN_WAIT_MODE 1//SPI clock stop when the MCU enters wait mode.
#define SPI_CLK_OPER_IN_WAIT_MODE (~1)//SPI clocks continue to operate in wait mode#define SPI_SINGLE_WIRE_MODE  0 //SPI configured for single-wire bidirectional operation
#define SPI_TWO_WIRE_MODE     (~0)//SPI uses separete pins for data input and data output./*
Update control register 2 (SPIC2) to enable additional SPI functions such as
the master mode-fault function and bidirectional mode output. Other optional
SPI functions are con?gured here as well.
FuncValue 使用Table_2
*/
void SetSPICtrlRegister2(UINT8 FuncValue);//SPI Baud Rate Register ------------------------------------------------------
/*|7     6   5       4    3     2   1     0   |
R    |--|-----|------|-----|---|-----|----|------||0 |SPPR2| SPPR1|SPPR0| 0 |SPR2 |SPR1| SPR0 ||--|-----|------|-----|---|-----|----|------|
Reset| 0| 0   |  0   |  0  |0  |0    |0   |0     |
= Unimplemented or Reserved
*/
//baudRate 参数单位为kbps
//BusClk 参数单位为kHz 该频率为MCGOUT 频率的一半
//确保Bus/baudRate等于如下表格中的值:
/*2    4     8   16    32      64      128   256|-------------------------------------------|
1|  2     |4    |8  |16   |32     |64     |128  |256 ||------|---|---|-----|-----|-----|----------|
2|  4   |8  |16 |32   |64     |128  |256    |512 ||------|---|---|-----|-----|-----|-----|----|
3|  6     |12   |24 |48   |96     |192  |384    |768 ||------|---|---|-----|-----|-----|-----|----|
4|  8   |16 |32 |64   |128  |256    |512    |1024||------|---|---|-----|-----|-----|-----|----|
5|  10  |20 |40 |80   |160  |320    |640    |1280||------|---|---|-----|-----|-----|-----|----|
6|  12  |24 |48 |96   |192  |384    |768    |1536||------|---|---|-----|-----|-----|-----|----|
7|  14  |28 |56 |112    |224    |448    |896    |1792||------|---|---|-----|-----|-----|-----|----|
8|  16  |32 |64 |128    |256    |512    |1024   |2048||-------------------------------------------|
*/
//如果设置不成功范围FALSE 0,否则返回非0
BOOL SetSPIBaudRate(USHORT16 baudRate,USHORT16 BusClk);
//SPI Status Register----------------------------------------------------------
/*7     6   5    4      3  2 1  0|----|--|------|-----|--|--|-|--|
R    |SPRF| 0| SPTEF| MODF| 0| 0|0| 0||----|--|------|-----|--|--|-|--|
Reset| 0  | 0| 1    | 0   |0 |0 |0| 0|
*/
#define SPRF_SHIFT 7#define RCV_BUF_NO_DATA 0#define RCV_BUF_AVAILABLE_DATA  1
#define SPTEF_SHIFT 5#define TRANS_BUF_NOT_EMPTY 0#define TRANS_BUF_EMPTY 1
#define MODF_SHIFT 4#define NO_MODE_FAULT 0#define MODE_FALT_OCCUR 1
//返回状态值
//目前状态值只有0 和 1
UINT8 SPIStatus(UINT8 shift);
/*
SS Pin Function setting
SSOE This bit is used in combination with the mode fault enable(MODFEN)bit in SPIC2 and the master/slave(MSTR)control bit to determin thefunction of the SS pin as show below.
-----------------------------------------------------------------
|MODFEN| SSOE |Master Mode                   |Slave Mode        |
-----------------------------------------------------------------
|0     |0     |General-purpose I/O (not SPI) |Slave select input|
-----------------------------------------------------------------
|0     |1     |General-purpose I/O (not SPI) |Slave select input|
----------------------------------------------------------------|
|1     |0     |SS input for mode fault       |Slave select input|
----------------------------------------------------------------|
|1     |1     |Automatic SS output           |Slave select input|
-----------------------------------------------------------------
参数modfen 取上表中 MODFEN列值
参数ssoe   取上表中 SSOE列表值
参数mode=1 将设置SPI为masterSPImode=0 将设置SPI为slaveSPI
*/
void SetSPISSpinFunction(UINT8 modfen,UINT8 ssoe,UINT8 mode);//One example-------------------------------------------------------------------
struct SPI_QUEUE {unsigned char option;unsigned char loopcount;unsigned char *data;
};enum SPI_OPTION {SPI_SS_TXD_LOW = 0x01,SPI_SS_RXD_HIGH = 0x02,SPI_SS_HIGH_TXD_ALL = 0x04,SPI_TXD_LOOP = 0x08
};void SPI_INIT(void);
/*
返回对方SPI通信设备交换回来的值
参数bdata为要发送的数据
*/
UINT8 SPITxD(UINT8 bdata);
/*
SS 管脚的值为1 SS=1 片选不选中。PTED4=1.SS为I/O口控制
*/
void SPISS1(void);
/*
SS 管脚的值为0 SS=0 片选选中。PTED4=0.SS为I/O口控制
*/
void SPISS0(void);#endif

源文件.c

#include <hidef.h>
#include "derivative.h"
#include "DataType.h"#include "SPI.h"//---------functions--------------//-------------------------------/*************************************************
* Function: spi_INIT
* Description:SPI Initialization
* Calls:
* Called By:
* Table Used:
* Input: void
*
* Output: void
* Return: void
* Others:
*************************************************/
void SPI_INIT(void)
{SetSinglePortDataDirection('E',2,1);//PTE2为输出端口,其他为输入端口SetPortData('E',1,0x04);//PTE2_SPI_CS 初始输出高电平,SetSPIBaudRate(1000,20000);//预分频器÷5,时钟速率除数4SetSPICtrlRegister1(SPI_ACTIVE);//禁止中断;SPI系统使能SPI配置为主SPI器件;SPI时钟低有效SetSPICtrlRegister1(SPI_TX_INTERRUPT_DISABLE);SetSPICtrlRegister1(SPI_AS_MASTER);SetSPICtrlRegister1(SPI_CLK_IDLES_HIGH);SetSPICtrlRegister1(SPI_DATA_CHANGE_0N_FALLING_EDGE);SetSPICtrlRegister1(SPI_SSOE_SET_ONE);SetSPICtrlRegister2(RESET_SPIC2);SetSPISSpinFunction(0,1,1); //SS as General-purpose I/O (not SPI)
}/*
Update control register 1 (SPIC1) to enable the SPI and to control interrupt
enables. This register also sets the SPI as master or slave, determines clock
phase and polarity, and configures the main SPI options.
*/
void SetSPICtrlRegister1(UINT8 FuncValue) {switch(FuncValue) {case    RESET_SPIC1:     //reset value for SPIC1SPIC1 = SPIC1_RESET;break;case    SPI_INTERRUPT_ENABLE:      //When SPRF or MODF is 1,request HW INTR.SPIC1 |= 0x80;break;case    SPI_INTERRUPT_DISABLE:  //use pollingSPIC1 &= 0x7F;break;case    SPI_ACTIVE:             //SPI system enabledSPIC1 |= 0x40;break;case    SPI_INACTIVE:          //SPI system inactiveSPIC1 &= 0xBF;break;case    SPI_TX_INTERRUPT_ENABLE:  //When SPTER is 1,hardware interrupt reqested.SPIC1 |= 0x20;break;case    SPI_TX_INTERRUPT_DISABLE: //use pollingSPIC1 &= 0xDF;break;case    SPI_AS_MASTER:             //SPI mode configured as a MASTER.SPIC1 |= 0x10;break;case    SPI_AS_SLAVE:         //SPI mode configured as a SLAVE.SPIC1 &= 0xEF;break;case    SPI_CLK_IDLES_HIGH:       //Active-low SPI clockSPIC1 |= 0x08;break;case    SPI_CLK_IDLES_LOW:    //Active-high SPI clockSPIC1 &= 0xF7;break;case    SPI_DATA_CHANGE_0N_FALLING_EDGE:  //First edge on SPSCLK at the start.SPIC1 |= 0x04;break;case    SPI_DATA_CHANGE_ON_RISING_EDGE:   //First edge on SPSCK occurs at the middle.SPIC1 &= 0xFB;break;case    SPI_SSOE_SET_ONE:  //use to set SS pin FunctionSPIC1 |= 0x02;break;case    SPI_SSOE_SET_ONE_REVERSE: //use to set SS pin FunctionSPIC1 &= 0xFD;break;case    SPI_LSB_DATA_FLOW:  //LSB Transfer modeSPIC1 |= 0x01;break;case    SPI_MSB_DATA_FLOW:   //MSB Transfer modeSPIC1 &= 0xFE;break;default:break; }
}
/*
Update control register 2 (SPIC2) to enable additional SPI functions such as
the master mode-fault function and bidirectional mode output. Other optional
SPI functions are con?gured here as well.
FuncValue 使用Table_2
*/
void SetSPICtrlRegister2(UINT8 FuncValue) {switch(FuncValue) {case RESET_SPIC2: //Reset commandSPIC2 = SPIC2_RESET;break;case MODE_FAULT_ENABLE://Mode fault function enabled,master SS pin acts as //the mode fault input or the slave select output.SPIC2 |= 0x10;break;case MODE_FAULT_DISABLE: //Mode fault function disabled,master SS pin reverts//to general-purpose I/O not controlled by SPI.SPIC2 &= 0xEF;break;case DATA_IO_AS_OUTPUT: //SPI I/O pin enabled as an outputSPIC2 |= 0x08;break;case DATA_IO_AS_INPUT://Output driver disabled so SPI data I/Opin act as input.SPIC2 &=0xF7;break;case SPI_CLK_STOP_IN_WAIT_MODE://SPI clock stop when the MCU enters wait mode.SPIC2 |= 0x02;break;case SPI_CLK_OPER_IN_WAIT_MODE://SPI clocks continue to operate in wait modeSPIC2 &= 0xFD;break;case SPI_SINGLE_WIRE_MODE: //SPI configured for single-wire bidirectional operationSPIC2 |= 0x01;break;case SPI_TWO_WIRE_MODE:   //SPI uses separete pins for data input and data output. SPIC2 &= 0xFE;break;default:break;    }}
//baudRate 参数单位为kbps
//BusClk 参数单位为kHz 该频率为MCGOUT 频率的一半
//确保Bus/baudRate等于如下结构中的值:
static USHORT16 ReliableValue[8][8]={
2     ,4    ,8  ,16 ,32   ,64     ,128  ,256,
4     ,8    ,16 ,32 ,64   ,128  ,256    ,512,
6     ,12   ,24 ,48 ,96   ,192  ,384    ,768,
8     ,16   ,32 ,64 ,128  ,256  ,512    ,1024,
10  ,20 ,40 ,80 ,160    ,320    ,640    ,1280,
12  ,24 ,48 ,96 ,192    ,384    ,768    ,1536,
14  ,28 ,56 ,112,   224 ,448    ,896    ,1792,
16  ,32 ,64 ,128,   256 ,512    ,1024   ,2048
};
/*2    4     8   16    32      64      128   256|-------------------------------------------|
1|  2     |4    |8  |16   |32     |64     |128  |256 ||------|---|---|-----|-----|-----|----------|
2|  4   |8  |16 |32   |64     |128  |256    |512 ||------|---|---|-----|-----|-----|-----|----|
3|  6     |12   |24 |48   |96     |192  |384    |768 ||------|---|---|-----|-----|-----|-----|----|
4|  8   |16 |32 |64   |128  |256    |512    |1024||------|---|---|-----|-----|-----|-----|----|
5|  10  |20 |40 |80   |160  |320    |640    |1280||------|---|---|-----|-----|-----|-----|----|
6|  12  |24 |48 |96   |192  |384    |768    |1536||------|---|---|-----|-----|-----|-----|----|
7|  14  |28 |56 |112    |224    |448    |896    |1792||------|---|---|-----|-----|-----|-----|----|
8|  16  |32 |64 |128    |256    |512    |1024   |2048||-------------------------------------------|
*/
//如果设置不成功范围FALSE 0,否则返回非0
BOOL SetSPIBaudRate(USHORT16 baudRate,USHORT16 BusClk) {UINT8 i=0,j=0,tag=0;USHORT16 temp = BusClk/baudRate;for(i = 0; i<8; i++) {for(j=0;j<8;j++){if(temp == ReliableValue[i][j]){tag =1;break;}}if(1 == tag) break;}if(1!=tag) return FALSE;SPIBR = (i<<4) | j;return TRUE;}
//返回状态值
//目前状态值只有0 和 1
UINT8 SPIStatus(UINT8 shift) {UINT8 temp = SPIS;temp = temp & (1<<shift);return temp>>shift;
}
/*
SS Pin Function setting
SSOE This bit is used in combination with the mode fault enable(MODFEN)bit in SPIC2 and the master/slave(MSTR)control bit to determin thefunction of the SS pin as show below.
-----------------------------------------------------------------
|MODFEN| SSOE |Master Mode                   |Slave Mode        |
-----------------------------------------------------------------
|0     |0     |General-purpose I/O (not SPI) |Slave select input|
-----------------------------------------------------------------
|0     |1     |General-purpose I/O (not SPI) |Slave select input|
----------------------------------------------------------------|
|1     |0     |SS input for mode fault       |Slave select input|
----------------------------------------------------------------|
|1     |1     |Automatic SS output           |Slave select input|
-----------------------------------------------------------------
参数modfen 取上表中 MODFEN列值
参数ssoe   取上表中 SSOE列表值
参数mode=1 将设置SPI为masterSPImode=0 将设置SPI为slaveSPI
*/
void SetSPISSpinFunction(UINT8 modfen,UINT8 ssoe,UINT8 mode) {UINT8 temp = SPIC1;temp &=0xED;temp |= 0x12 & ((mode<<4) | (ssoe<<1));SPIC1 = temp;temp = 0;temp = SPIC2;temp &=0xEF;temp |= 0x10 & (modfen<<4); SPIC2 = temp;
}
/*************************************************
* Function: spi_TxD
* Description: spi Transmit
* Calls:
* Called By: LoadMails
* Table Used:
* Input: ID, Data Length, Data
*
* Output: void
* Return: void
* Others:
*************************************************/
UINT8 SPITxD(UINT8 bdata)
{while ( 1 ) {if ( SPIS & 0x20 ) //一直等待直到SPI发送缓冲器空{SPID = bdata;//写入要发送的数据break;}};while ( 1 ) {if ( SPIS & 0x80 ) {return SPID;//返回接收到的数据}};
}void SPISS1(void)
{PTED = 0x04;// SPI_CS 高电平
}void SPISS0(void)
{PTED = 0x00;//SPI_CS 低电平
}//----------------------下面函数没有用到------------------------------------
void SPI_Queue(UINT8 option, UINT8 loop, UINT8 *value) {
}void interrupt VectorNumber_Vspi SPI_ISR(void) {
}
//--------------------------------------------------------------------------------

第五课 MC9S08DZ60之串行外围设备接口SPI相关推荐

  1. stm32f1系列串行外围设备接口---SPI

    SPI也是一种通信协议.它与我们之前介绍的USART不同的主要是,SPI属于同步通信协议,USART属于异步通信的协议.SPI的控制也主要是三个寄存器,状态(SR)控制(CR)数据(DR).其实一般协 ...

  2. SPI串行外围设备接口

    一.要知道SPI总线是什么,首先要知道具体的通信时序是怎样的? 串行外围设备接口SPI(serial peripheral interface)总线技术是Motorola公司推出的一种同步串行接口. ...

  3. SPI (串行外围设备接口) 协议简介

    1.SPI协议简介 1.1 SPI协议概括 SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口.是Motorola首先在其MC68HCXX系列处理 ...

  4. F28335第十一篇——串行外设接口(SPI)

    摘要 本文大致介绍了F28335中SPI工作原理和大致寄存器.还有很多细节知识没有列出,需要详细了解的同学,可以参考TI官方文档(TI官网免费下载),或者可以看书籍.重点推荐符晓编写的<TMS3 ...

  5. platform框架--Linux MISC杂项框架--Linux INPUT子系统框架--串行集成电路总线I2C设备驱动框架--串行外设接口SPI 设备驱动框架---通用异步收发器UART驱动框架

    platform框架 input. pinctrl. gpio 子系统都是 Linux 内核针对某一类设备而创建的框架, input子系统是管理输入的子系统 pinctrl 子系统重点是设置 PIN( ...

  6. 嵌入式硬件协议: SPI串行外设接口 Serial Peripheral Interface

    简介 SPI 协议是由摩托罗拉公司提出的通讯协议(Serial Peripheral Interface),即串行外围设备接口,是 一种高速全双工的通信总线.它被广泛地使用在ADC.LCD 等设备与M ...

  7. arduino教程-9. 串行外设接口(spi)

    文章目录 相关资料 1. spi针脚 Arduino 串行外设接口 串行外设接口简介 板的SPI引脚 SPI.h 库 SPI.h官方示例 SPI为主机 例子 SPI为从机 例子 相关资料 SPI li ...

  8. SWD是一种串行调试接口

    1.SWD是一种串行调试接口,与JTAG相比,SWD只要两根线,分别为:SWCLK和SWDIO.减少了对单片机GPIO口的占用,SWD方式可以在线调试的. SWDIO–串行数据线,用于数据的读出和写入 ...

  9. SSI(串行同步接口)协议如何工作

    SSI(串行同步接口)是连接绝对位置传感器和控制器的广泛应用的串行接口.SSI利用控制器发出一个时钟脉冲序列,初始化传感器的门限输出. 传感器不断更新位置数据,并传送到移位寄存器中.在每一个时钟脉冲序 ...

最新文章

  1. 如何把html转换pdf,怎么把html转换成pdf
  2. Linux停用“黑名单”,因为这是敏感词,涉嫌种族歧视
  3. R语言ggplot2可视化整体排序的水平堆叠条形图(Ordered Stacked Horizontal Barplot)
  4. feign date类型时间错误问题
  5. C++与MATLAB数组的存储结构
  6. -webkit-overflow-scrolling与苹果
  7. dispatch作用 react_「React系列」手把手带你撸后台系统(Redux与路由鉴权)
  8. [置顶] hdu 1890 伸展树区间翻转
  9. bInitiallyDisabled实现原理
  10. javax.validation.ValidationException: Unable to find a default provider
  11. dotNet中初始化器的使用
  12. 浅谈line-height和vertical-align
  13. 【BlackHat】黑帽大会上值得关注的安全工具
  14. spark textFile方法
  15. 浅谈算法和数据结构: 十一 哈希表
  16. web项目中镶嵌player
  17. 115网盘播放html5,新版115网盘加强个人社交功能 支持Html5技术
  18. java uml类图虚线实线_时序图的实线和虚线-类图中的实线与虚线-用例图中实线箭头表示什么...
  19. python的jieba分词词性标注
  20. Java实体类(entity)作用

热门文章

  1. 300页PPT带你学习人工智能应用基础
  2. 福昕阅读器软件foxit设置快…
  3. php图像处理类实现缩放 裁剪 加水印,ThinkPHP图像的裁剪、缩放、加水印
  4. X-vector系列论文 | Spoken Language Recognition using X-vectors
  5. 基于嵌入式linux电子相册设计,用于LINUX或者嵌入式LINUX的电子相册程序,基于QT开发...
  6. timescale 学习
  7. 腕表珠宝成为女性跨境消费新晋宠儿;爱彼迎全球约55%的新增房东为女性 | 美通企业日报...
  8. Description Resource Path Location Type Target runtime Apache Tomcat v8.0 is not defined.
  9. 中国三维交互式投影仪行业市场供需与战略研究报告
  10. 巨头战长沙 无人逛菜场