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

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

调试已经通过

///////////////////////////spi.h/////////////////////////////

#ifndef

SPI_H

#define

SPI_H

#include

<stc12le5a60s2.h>

#include

<spi.h>

//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

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

///////////////////////////spi.c/////////////////////////////

#include<spi.h>

//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

}

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

可以的,但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

}


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

原文地址: https://outofmemory.cn/yw/7753613.html

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

发表评论

登录后才能评论

评论列表(0条)

保存