///////////////////////////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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)