51单片机 主从机模拟 spi通讯
2019-04-15 12:15发布
生成海报
51单片机 主从机模拟 spi通讯
困惑我的问题:
1.SCK频率的设置问题。
2.提取AD数据的时机问题。
spi基本知识。
双全工同步串行接口
1.工作模式
CPOL=0 低电平空闲状态
CPOL=1 高电平空闲状态
CPHA=0 第一个边沿采集数据 第二个边沿输出数据
CPHA=1 第二个边沿采集数据 第一个边沿输出数据
2.时序图(截取书本)
3.主从机的设置与区别
主机产生时钟信号,从机在接受到时钟信号才会发出信息。从机片选信号由主机IO口控制,低电平有效。
(主机片选接口接高电平)
主机代码
// spi.h
#ifndef SPI_H
#define SPI_H
#include
sbit SCK = P3^4;
sbit SDO = P3^6;
sbit SDI = P3^5;
sbit SSL = P3^7;
sbit led = P0^4;
void spi_init();
void spiwrite(char );
unsigned char spiread();
void delayus();
#endif
//spi.c
#include"spi.h"
#define uchar unsigned char
#define uint unsigned int
void delayus()
{
uint i;
for(i=0;i<300;i++);
}
void spi_init()
{
SCK=0;
}
void spiwrite(uchar dat)
{
uchar i;
SCK=0;
for(i=0;i<8;i++)
{
SDO=(bit)(dat&0x80);
SCK=0;
SCK=1;//上升沿输出数据
dat<<=1;
}
}
uchar spiread()
{
uchar b,i;
SCK=1;
for(i=0;i<8;i++)
{
SCK=1;
SCK=0;//下降沿输入数据
b<<=1;
b|=(uchar)SDI;
delayus();
}
return(b);
}
//main.c
#include"spi.h"
main()
{
SSL=0;
P0=spiread();
SSL=1;
SSL=0;
spiwrite(0xaa);
SSL=1;
while(1)
{
}
}
从机代码
//spi.h
#ifndef SPI_H
#define SPI_H
#include
sbit SCK = P3^4;
sbit SDO = P3^5;
sbit SDI = P3^6;
sbit SSL = P3^7;
sbit led = P0^4;
void spi_init();
void spiwrite(char );
unsigned char spiread();
void delayus();
#endif
//spi.c
#include"spi.h"
#define uchar unsigned char
#define uint unsigned int
void delayus()
{
uint i;
for(i=0;i<30;i++);
}
void spi_init()
{
SCK=0;
}
void spiwrite(uchar dat)
{
uchar i;
while(SSL==1);
while(SCK==0); //bug1:缺失这一步有问题
while(SCK==1);
for(i=0;i<8;i++)
{
while(SCK==1);
SDO=(bit)(dat&0x80);
dat<<=1;
while(SCK==0); //下降沿输出数据
// P1=~(1<
}
}
uchar spiread()
{
uchar b,i;
while(SSL==1);
while(SCK==0);
for(i=0;i<8;i++)
{
while(SCK==0);
b<<=1;
b|=(uchar)SDI;
while(SCK==1); //上升沿读取数据
}
return(b);
}
//main.c
#include"spi.h"
main()
{
spiwrite(0xF0);
P0=spiread();
while(1)
{
}
}
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮