51单片机 主从机模拟 spi通讯

编程入门 行业动态 更新时间:2024-10-28 20:18:17

51单片机 <a href=https://www.elefans.com/category/jswz/34/1768145.html style=主从机模拟 spi通讯"/>

51单片机 主从机模拟 spi通讯

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<reg52.h>

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<reg52.h>

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<<i);
    }


}

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)
   {
   
   }

}












更多推荐

51单片机 主从机模拟 spi通讯

本文发布于:2024-02-08 14:52:23,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1674211.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:主从   单片机   通讯   spi

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!