zoukankan      html  css  js  c++  java
  • 单片机IO口模拟SPI四种模式的程序

    #include "iom8535v.h"
    #define _CPOL     1
    #define _CPHA     0
    #define SCK_IO    DDRA|=0X01
    #define MOSI_IO   DDRA|=0X02
    #define MISO_IO   DDRA&=0XFB
    #define SSEL_IO   DDRA|=0X08
    #define SCK_D(X)   (X?(PORTA|=0X01):(PORTA&=0XFE))
    #define MOSI_D(X)  (X?(PORTA|=0X02):(PORTA&=0XFD))
    #define SSEL_D(X)  (X?(PORTA|=0X08):(PORTA&=0XF7))
    
    #define MISO_I()  (PINA&0X04)  
    void delay()
    {
     unsigned char m,n;
         for(n=0;n<5;n++);
        for(m=0;m<100;m++);
    }
    /************************************************
            端口方向配置  与输出初始化
    ************************************************/
    void SPI_Init(void)
    {
    SCK_IO   ; 
    MOSI_IO  ;
    MISO_IO  ; 
    SSEL_IO  ;
    SSEL_D(1);
    MOSI_D(1);
    #if _CPOL==0
    SCK_D(0);
    #else
    SCK_D(1);
    #endif
    }
    
    /**********************************************
    模式零           写数据
    ***********************************************/
    #if _CPOL==0&&_CPHA==0          //MODE   0  0   
    void SPI_Send_Dat(unsigned char dat)
    {
     unsigned char n;
     for(n=0;n<8;n++)
     {
      SCK_D(0);
      if(dat&0x80)MOSI_D(1);
      else MOSI_D(0);
      dat<<=1;
      SCK_D(1);
     }
      SCK_D(0);
    }
    /*********************************************
    模式零         读数据
    *********************************************/
    unsigned char SPI_Receiver_Dat(void)
    {
     unsigned char n ,dat,bit_t;
     for(n=0;n<8;n++)
     {
      SCK_D(0);
      dat<<=1;
      if(MISO_I())dat|=0x01;
      else dat&=0xfe;
      SCK_D(1);
     }
      SCK_D(0);
      return dat;
    }
    #endif
    /**********************************************
    模式二           写数据
    ***********************************************/
    #if _CPOL==1&&_CPHA==0           //MODE   1  0
    void SPI_Send_Dat(unsigned char dat)
    {
     unsigned char n;
     for(n=0;n<8;n++)
     {
      SCK_D(1);
      if(dat&0x80)MOSI_D(1);
      else MOSI_D(0);
      dat<<=1;
      SCK_D(0);
     }
      SCK_D(1);
    }
    /*********************************************
    模式二          读数据
    *********************************************/
    unsigned char SPI_Receiver_Dat(void)
    {
     unsigned char n ,dat,bit_t;
     for(n=0;n<8;n++)
     {
      SCK_D(1);
      dat<<=1;
      if(MISO_I())dat|=0x01;
      else dat&=0xfe;
      SCK_D(0);
     }
      SCK_D(1);
      return dat;
    }
    
    #endif
    /*********************************************
    模式一        写数据
    *********************************************/
    #if _CPOL==0&&_CPHA==1           //MODE  0  1
    void SPI_Send_Dat(unsigned char dat)
    {
     unsigned char n;
     SCK_D(0);
     for(n=0;n<8;n++)
     {
      SCK_D(1);
      if(dat&0x80)MOSI_D(1);
      else MOSI_D(0);
      dat<<=1;
      SCK_D(0);
     }
    }
    /*********************************************
    模式一       读数据
    *********************************************/
    unsigned char SPI_Receiver_Dat(void)
    {
     unsigned char n ,dat,bit_t;
     for(n=0;n<8;n++)
     {
      SCK_D(1);
       dat<<=1;
      if(MISO_I())dat|=0x01;
      else dat&=0xfe;
      SCK_D(0);
     }
      SCK_D(0);
      return dat;
    }
    #endif
    ///////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////
    
    #if _CPOL==1&&_CPHA==1            //MODE  1  1
    void SPI_Send_Dat(unsigned char dat)
    {
     unsigned char n;
     SCK_D(1);
     for(n=0;n<8;n++)
     {
      SCK_D(0);
      if(dat&0x80)MOSI_D(1);
      else MOSI_D(0);
      dat<<=1;
      SCK_D(1);
     }
    }
    /************************************
    模式三          读数据
    ************************************/
    unsigned char SPI_Receiver_Dat(void)
    {
     unsigned char n ,dat,bit_t;
     SCK_D(0);
     for(n=0;n<8;n++)
     { SCK_D(0);
      dat<<=1;
      if(MISO_I())dat|=0x01;
      else dat&=0xfe;
      SCK_D(1);
     }
      SCK_D(1);
      return dat;
    }
    #endif
    /*************************************
    *************************************/
    void main()
    {
    
    SPI_Init();
    DDRB = 0XFF;
    //#if _CPOL
    //SCK_D(0);
    //#endif
    while(1)
    {
    //SSEL_D(0);
    //SPI_Send_Dat(0x01);
    //SPI_Send_Dat(0x31);
    //SSEL_D(1);
    SSEL_D(0);
    SPI_Send_Dat(0x81);
    PORTB =SPI_Receiver_Dat();
    SSEL_D(1);
    //delay();
    }
    }

    转至:http://blog.csdn.net/zyboy2000/article/details/11861329
  • 相关阅读:
    什么是程序员的优秀品质?【转】
    我也来评“超级女声”五强选手
    ddd
    在window 2003 server下遇到的asp错误
    几个asp+操作日期的函数
    vb.net常用函数
    WordPress使用小记
    asp.net身份验证方式
    水晶报表如何导出为Excel文档
    ListView选中selectedItem上下移动
  • 原文地址:https://www.cnblogs.com/jungle1989/p/7025944.html
Copyright © 2011-2022 走看看