求51单片机模拟SPI通讯的C程序,最好带详解!谢谢

求51单片机模拟SPI通讯的C程序,最好带详解!谢谢,第1张

调试已经通过

///////////////////////////spih/////////////////////////////

#ifndef

SPI_H

#define

SPI_H

#include

<stc12le5a60s2h>

#include

<spih>

//sfr

P4

=

0xe8;

//STC12LE5A60S2单片机自带SPI控制器连接

//sbit

VCC1

=

P2^0;//

VCC1

NO

USE

//sbit

SON

=

P1^6

;//

MISO

//sbit

SIN

=

P1^5

;//

MOSI

//sbit

SCKN

=

P1^7

;

//

SCK

sbit

CSN

=

P1^4

;//

28J60

--

CS

//sbit

RSTN

=

P3^5

;

//RST,

no

use

//sbit

INTN

=

P3^3

;

//

INT,

no

use

void

init_spi(void);

void

WriteByte(u8_t

temp);

u8_t

ReadByte(void);

#endif

////////////////////////////////////////////////////////////////

///////////////////////////spic/////////////////////////////

#include<spih>

//STC12LE5A60S2单片机自带SPI控制器连接

void

init_spi(void)

{

//SSIG

=

1;

//忽略SS脚

//SPEN

=

1;

//允许SPI工作

//DORD

=

0;

//先传高位MSB

//MSTR

=

1;

//设置单片机为主机

SPCTL

=

0xD0;

//SPI

Control

Register

SSIG

SPEN

DORD

MSTR

CPOL

CPHA

SPR1

SPR0

0000,0100

SPSTAT

=

0xC0;

//

//IE2

|=

0x02;

//允许SPI中断控制位

}

void

WriteByte(u8_t

temp)

{

SPDAT

=

temp;

while(!(SPSTAT

&

0x80));

SPSTAT

=

0xC0;

}

u8_t

ReadByte(void)

{

idata

u8_t

temp;

//SPSTAT

=

0xC0;

SPDAT

=

0x00;

while(!(SPSTAT

&

0x80));

temp

=

SPDAT;

SPSTAT

=

0xC0;

return

temp;

}

////////////////////////////////////////////////////////////////

void SpiWriteRegister (uchar reg, uchar value)

{

RF_NSEL = 0; // 片选拉低启动SPI通讯

SPI0DAT = (reg|0x80); // 写入1个字节的寄存器地址

while( SPIF == 0); // 等待SPI传输完成

SPIF = 0;

SPI0DAT = value; // 继续写入第二个字节(寄存器值)

while( SPIF == 0); // 等待SPI传输完成

SPIF = 0;

RF_NSEL = 1; // 片选拉高结束SPI通讯

}

//-----------------------------------------------------------------------------

//函数描述: SPI读取函数

//相关参数:

//返回信息:

//

//-----------------------------------------------------------------------------

uchar SpiReadRegister (uchar reg)

{

RF_NSEL = 0; // 片选拉低启动SPI通讯

SPI0DAT = reg; // 写入1个字节的寄存器地址

while( SPIF == 0); // 等待SPI传输完成

SPIF = 0;

SPI0DAT = 0xFF; // 写一个Dummy字节(因为要读取的话必须用写入来启动一个交换数据的传输),当写入完成后从机的数据也完成了读入。

while( SPIF == 0); // 等待SPI传输完成

SPIF = 0;

RF_NSEL = 1; // 片选拉高结束SPI通讯

return SPI0DAT; // 返回读取的值(在SPI0DAT=0xFF中完成读取)

}

需要注意的是读写 *** 作实际上完成的都是数据的交换,即主机传送1个字节给从机,从机同时传送1个字节给主机。所以读 *** 作看起来像是写数据,但实际上写入完成后就可以从SPI0DAT中获得从机的应答数据了。

可以的,但SPI接口的器件有多种工作方式,如高位在前还是低位在前,空闲时时钟线高电平还是低电平

第一个跳变沿还是第二个跳变沿数据有效,程序是不同的,下面程序供参考

sbit CLK=P2^2;

sbit MOSI=P2^3; //发送方方管脚配置

sbit MISO=P2^4;

sbit BIT0=ACC^0;

sbit BIT7=ACC^7;//

void Write(uchar byte)//写数据

{

uchar i;

ACC=byte;

i=8;

while(i)

{

MOSI=BIT7;

CLK=1; // output 'uchar', MSB to MOSI

_nop_();

_nop_(); // shift next bit into MSB

_nop_();

_nop_();

ACC<<=1;

CLK=0; // Set SCK high

i--; // then set SCK low again

_nop_();

}

}

/

/函数:Read(uchar reg)

/功能:NRF24L01的读时序

//

uchar Read(void)

{

uchar i;

i=8;

sbit BIT0=ACC^0;

sbit BIT7=ACC^7;

while(i)

{

CLK=1; // output 'uchar', MSB to MOSI

_nop_();

_nop_();

_nop_();

_nop_(); // shift next bit into MSB

ACC<<=1;

BIT0=MISO ;

CLK=0; // Set SCK high

i--; // then set SCK low again

_nop_();

//led1=~led1;

}

return ACC; // return register value

}

以上就是关于求51单片机模拟SPI通讯的C程序,最好带详解!谢谢全部的内容,包括:求51单片机模拟SPI通讯的C程序,最好带详解!谢谢、帮忙分析一个这个spi读写程序,详细一点的,解释一下。怎么觉得读和写的内容怎么差不多呢,怎么实现的读写、用51单片机引脚实现spi功能的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9745890.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存