这种SPI
程序慧肆用51单片机的I/O口弯碧没线很好模拟的,仔细看芯片的文档,下面这个是用在NRF905的:uchar bdata DATA_BUFsbit flag =DATA_BUF^7sbit flag1 =DATA_BUF^0/*******************************************************************************************///function SpiWrite()void SpiWrite(uchar byte){ uchar i DATA_BUF=byte // Put function's parameter into a bdata variable for (i=0i<8i++) // Setup byte circulation bits { if (flag) // Put DATA_BUF.7 on data line MOSI_nRF905=1 else MOSI_nRF905=0 SCK=1 // Set clock line high DATA_BUF=DATA_BUF<埋纳<1 // Shift DATA_BUF SCK=0 // Set clock line low } MOSI_nRF905=1}/*******************************************************************************************///function SpiRead()uchar SpiRead(void){ uchar i for (i=0i<8i++) // Setup byte circulation bits { DATA_BUF=DATA_BUF<<1 // Right shift DATA_BUF SCK=1 // Set clock line high if (MISO_nRF905) flag1=1 // Read data else flag1=0 SCK=0 // Set clock line low } MISO_nRF905=1 return DATA_BUF // Return function parameter}实现单片机和PC机进行SPI通讯方法:\x0d\x0a1:电路设计\x0d\x0a设计的电路,利用两片AT89C52芯片,一片做为发送模块,一片做为接收模块。分别编写发送和接收程序,实现
数据的发送和接受。通过LED显示接收到的数据。通过示波器观察输出的波形。\x0d\x0a2:编写程序\x0d\x0a根据设计好的电路及题目要求分别编写数据发送程序和数据接收程序。①:数据发送程序#define\x0d\x0aucharunsignedchar\x0d\x0a#defineuintunsignedint\x0d\x0a\x0d\x0a#defineulongunsignedlong\x0d\x0a//---------------------------#include\x0d\x0a#include\x0d\x0a//---------------------------sbitSPICLK=P1^0//时钟信号sbitMOSI=P1^1//主
器件数据输出,从器件数据输入sbitMISO=P1^2//主器件数据输入,从器件数据输出\x0d\x0asbitSS=P1^3//从器件使能信号\x0d\x0avoidDat_Transmit(uchardat)//发送数据程序\x0d\x0a{uchari,datbuf\x0d\x0adatbuf=dat\x0d\x0aSS=1while(SS){}for(i=0i\x0d\x0a#include\x0d\x0a//---------------------------sbitSPICLK=P1^0//时钟信号sbitMOSI=P1^1//主器件数据输出,从器件数据输入sbitMISO=P1^2//主器件数据输入,返裤运从器件数据输出sbitSS=P1^3//从器件使能信号\x0d\x0a\x0d\x0a//---------------------------voidNop(void)\x0d\x0a{\x0d\x0a}\x0d\x0avoidDelay(uchart){while(t--){}\x0d\x0a}\x0d\x0a\x0d\x0aucharData_Receive(void)//数据接收程序\x0d\x0a{uchari,dat=0,tempbit\x0d\x0abt\x0d\x0a\x0d\x0aSPICLK=1MISO=1SS=0\x0d\x0a//选中器件\x0d\x0aNop()Nop()\x0d\x0afor(i=0i
回答于 2022-12-14调试已经通过
///////////////////////////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
}
/////氏谈///////////////////////////////////////////////////////////
评论列表(0条)