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

来源:互联网 发布:淘宝直通车使用条件 编辑:程序博客网 时间:2024/05/17 02:11
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)
   {
   
   }

}












原创粉丝点击