• 单片机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
  • 相关阅读:
    TensorFLow手写字识别深度学习网络分析详解
    使用MSBUILD 构建时出错 error MSB3086: 任务未能使用 SdkToolsPath“”或注册表项“XXX”找到“LC.exe”,请确保已设置 SdkToolsPath。
    解决Win7启动时出现“windows未能启动。原因可能是最近更改了硬件或软件”的问题
    SSH安装篇之——SecureCRT连接(内网和外网)虚拟机中的Linux系统(Ubuntu)
    git push 冲突
    ubuntu快捷键收集
    ubuntu中wine下安装QQ
    ubuntu下安装无线网卡去驱动Qualcomm-Atheros-QCA9377
    spring mvc添加静态资源访问时@Controller无效的解决
    git更新到远程服务器代码
  • 原文地址:https://www.cnblogs.com/jungle1989/p/7025944.html
Copyright © 2020-2023  润新知