求51单片机模拟SPI通讯的C程序,最好带详解!谢谢
51单片机模拟SPI通讯的程序,最好带详解。如果是有SPI接口的单片机,如STC12系列的单片机自带SPI口,应该怎么写SPI通讯程序。多谢高手指点,谢谢!...
51单片机模拟SPI通讯的程序,最好带详解。如果是有SPI接口的单片机,如STC12系列的单片机自带SPI口,应该怎么写SPI通讯程序。多谢高手指点,谢谢!
展开
4个回答
展开全部
调试已经通过
///////////////////////////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.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的单片机应用,先要去了解SPI的时序关系,程序是基于时序写的。不带SPI的单片机写SPI程序就是IO口模拟,带SPI的单片机你就不用关心SPI功能实现了,把相关MCU的数据手册看一下,都会有SPI部分的寄存器控制码和例程。
STC系列的也有相关例程,STC的官网是 www.stcmcu.com,建议你去他们官网下个数据手册看一下,自己理解了最重要。
STC系列的也有相关例程,STC的官网是 www.stcmcu.com,建议你去他们官网下个数据手册看一下,自己理解了最重要。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
MOSI MISO sck csn 这两天考试!你加我 然后我和你聊聊!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询