SPI读写函数

来源:互联网 发布:soc网络安全管理平台 编辑:程序博客网 时间:2024/06/06 05:46

#include <REGX52.H>

#define uchar unsigned char
#define uint8 unsigned char
#define uint  unsigned int
#define ulong unsigned long

//               累加器带进位右移指令 RRC A                                 
#define _rrca_()          CY  = ACC & 0x01                                
//汇编代码       rrc a

//               累加器带进位左移指令 RLC A                                 
#define _rlca_()          CY  = ACC & 0x80
//汇编代码       rlc a


sbit c_SPI_SI = P1^5;
sbit c_SPI_SO = P1^6;
sbit c_SPI_CLK = P1^7;

#define Macro_Set_SI_High()      c_SPI_SI = 1
#define Macro_Set_SI_Low()      c_SPI_SI = 0
#define Macro_Set_CLK_High()      c_SPI_CLK = 1
#define Macro_Set_CLK_Low()      c_SPI_CLK = 0

/*
//----------------标准C语言版-----------------------------------------
//可移植性好,易读,易移植
uint8 SD_SPI_ReadByte(void)
{
    uchar ACC;
    uchar ucCount;

    ACC = 0;
    Macro_Set_SI_High();

    for(ucCount=0; ucCount<8; ucCount++)
    {
        ACC <<= 1;
        Macro_Set_CLK_Low();

        Macro_Set_CLK_High();
    
        if(c_SPI_SO)
        {
            ACC |= 0x01;
        }
    }

    return(ACC);
}

void SD_SPI_WriteByte(uint8 ucSenddata)  
{   
    uchar ucCount;
    uchar ucMaskcode;

    ucMaskcode = 0x80;
    for(ucCount=0; ucCount<8; ucCount++)
    {
        Macro_Set_CLK_Low();

        if(ucMaskcode & ucSenddata)
        {
            Macro_Set_SI_High();
        }
        else
        {
            Macro_Set_SI_Low();
        }
        Macro_Set_CLK_High();
        ucMaskcode >>= 1;
    }


*/

//-------------------------标准优化版SPI读写函数---------
//uchar bdata ACC;
sbit ACC_0 = ACC^0;
sbit ACC_1 = ACC^1;
sbit ACC_2 = ACC^2;
sbit ACC_3 = ACC^3;
sbit ACC_4 = ACC^4;
sbit ACC_5 = ACC^5;
sbit ACC_6 = ACC^6;
sbit ACC_7 = ACC^7;


uint8 SD_SPI_ReadByte(void)
{
//初始化SI引脚状态
    Macro_Set_SI_High();

//bit7 Shift Out
    Macro_Set_CLK_Low();
    Macro_Set_CLK_High();
    CY = c_SPI_SO;
    _rlca_();    
//    ACC = P1;

//bit6 Shift Out
    Macro_Set_CLK_Low();
    Macro_Set_CLK_High();
    CY = c_SPI_SO;
    _rlca_();    

//bit5 Shift Out
    Macro_Set_CLK_Low();
    Macro_Set_CLK_High();
    CY = c_SPI_SO;
    _rlca_();    

//bit4 Shift Out
    Macro_Set_CLK_Low();
    Macro_Set_CLK_High();
    CY = c_SPI_SO;
    _rlca_();    

//bit3 Shift Out
    Macro_Set_CLK_Low();
    Macro_Set_CLK_High();
    CY = c_SPI_SO;
    _rlca_();    

//bit2 Shift Out
    Macro_Set_CLK_Low();
    Macro_Set_CLK_High();
    CY = c_SPI_SO;
    _rlca_();    

//bit1 Shift Out
    Macro_Set_CLK_Low();
    Macro_Set_CLK_High();
    CY = c_SPI_SO;
    _rlca_();    

//bit0 Shift Out
    Macro_Set_CLK_Low();
    Macro_Set_CLK_High();
    CY = c_SPI_SO;
    _rlca_();    

    return(ACC);
}

void SD_SPI_WriteByte(uint8 ucSenddata)  
{   
    ACC = ucSenddata;
    
//bit7 Shift Out To SD Card
    Macro_Set_CLK_Low();
    c_SPI_SI = ACC_7;
    Macro_Set_CLK_High();

//bit6 Shift Out To SD Card
    Macro_Set_CLK_Low();
    c_SPI_SI = ACC_6;
    Macro_Set_CLK_High();
//bit5 Shift Out To SD Card
    Macro_Set_CLK_Low();
    c_SPI_SI = ACC_5;
    Macro_Set_CLK_High();
//bit4 Shift Out To SD Card
    Macro_Set_CLK_Low();
    c_SPI_SI = ACC_4;
    Macro_Set_CLK_High();
//bit3 Shift Out To SD Card
    Macro_Set_CLK_Low();
    c_SPI_SI = ACC_3;
    Macro_Set_CLK_High();
//bit2 Shift Out To SD Card
    Macro_Set_CLK_Low();
    c_SPI_SI = ACC_2;
    Macro_Set_CLK_High();
//bit1 Shift Out To SD Card
    Macro_Set_CLK_Low();
    c_SPI_SI = ACC_1;
    Macro_Set_CLK_High();
//bit0 Shift Out To SD Card
    Macro_Set_CLK_Low();
    c_SPI_SI = ACC_0;
    Macro_Set_CLK_High();


//2楼: 奉上测试程序及测试记录 

//void TestSD_SPIFunc(void)
void main(void)
{
    uchar ucCount;
    uchar ucReaddata;


    ucCount = 0;        //开始

    for(ucCount=10; ucCount!=0; ucCount--)    //xwj改进的写法,机器周期数从502减少到481,节约21
    {
        SD_SPI_WriteByte(0x88);            //用C语言实现的写字节机器周期数为188
                                        //用C51的bdata变量,采用位指令直接传送操作,共用机器周期47
                                        //xwj改进的写法,共用机器周期46
    }

    for(ucCount=50; ucCount!=0; ucCount--)    //xwj改进的写法,机器周期数从2607减少到2091,节约516
    {
        ucReaddata = SD_SPI_ReadByte();    //用C语言实现的SPI读字节,机器周期为154
                                        //自用C51的bdata变量,采用位指令操作读字节机器周期为49
                                        //xwj改进的写法,共用机器周期40
    }
    ucCount= 88;        //结束
//    SD_read_sector(0,Page_Buf);
}

原创粉丝点击