STC单片机软件模拟SPI 兼容类比芯片SPI驱动

/*
  analogysemi
  xutong 2024/1/23
*/
#ifndef __BSP_LPSPI_H
#define __BSP_LPSPI_H

#include "config.h"
#define SPI_SCLK(x)        P25=(x)
#define SPI_MOSI(x)        P23=(x)
#define SPI_MISO            P24
#define SPI_CS1(x)        P22=(x)                                                                                                                                                                                             
#define SPI_CS2(x)        P21=(x) 

void LPSPI_Init(void);
void Lpspi_Write(uint8_t datasize,uint8_t *datas);
void Lpspi_Read(uint8_t datasize,uint8_t *datas,uint8_t *Rxdata);

#endif /* __BSP_LPSPI_H */
#include "bsp_lpspi.h"
#include    "STC8xxxx.H"

void LPSPI_Init(void)
{
    //设置除了MISO为输入外,其他为输出模式
    P2M0 = 0xEF;  //设置P2.0~P2.7为推挽输出模式
    P2M1 = 0x10;
        
}

void SPI_Transmit_Data_mode1(uint8_t *TXData ,uint8_t Size)   //SCLK low  second edge
{
    uint8_t i,a=0,datas=0;
    for(a=0;a<Size;a++)
    {
        datas = TXData[a];
        for(i = 0;i < 8;i++)
        {
            SPI_SCLK(1);
            if(datas&(0x80))//data bit = 1
            {
                    SPI_MOSI(1);//MOSI SET 1
            }
            else
            {
                SPI_MOSI(0);//MOSI SET 1
            }
            datas <<=1;
            SPI_SCLK(0);
        }
    }
}
void SPI_Receive_Data_mode1( uint8_t *TXData,uint8_t *Rxdata ,uint8_t Size)   //SCLK low  second edge
{
    uint8_t i,a,datas;
    
    for(a=0;a<Size;a++)
    {
        datas = TXData[a];
        Rxdata[a]=0;
        for(i = 0;i < 8;i++)
        {
            SPI_SCLK(1);
            if(datas&(0x80))//data bit = 1
            {
                    SPI_MOSI(1);//MOSI SET 1    
            }
            else
            {
                    SPI_MOSI(0);//MOSI SET 0    
            }
            datas <<=1;
             SPI_SCLK(0);
            
            if(SPI_MISO==1)
            {
                Rxdata[a]|=(0x80 >>i);
            }
        }
    }
}

void Lpspi_Write(uint8_t datasize,uint8_t *datas)
{
  SPI_Transmit_Data_mode1(datas,datasize);
}
void Lpspi_Read(uint8_t datasize,uint8_t *datas,uint8_t *Rxdata)
{
  SPI_Receive_Data_mode1(datas,Rxdata,datasize);
}

 

posted @ 2024-01-23 17:46  xuyuntong  阅读(42)  评论(0编辑  收藏  举报