SPI模拟:

数据传输
SCK (CPOL = 0)情况的模拟:特别说明,这里的时钟线、片选信号线加了反向器;MOSI、MISO线正常
模拟往地址0x55写入0x5a,然后读取0x55里面的内容的情况
这里只是模拟,对应到实际的操作,应该看从SPI器件可以访问的存储空间的范围以及对应的读写权限。

/////////////////////////////////////////////////////////////////////
//功    能:读RC632寄存器
//参数说明:Address[IN]:寄存器地址
//返    回:读出的值
/////////////////////////////////////////////////////////////////////
unsigned char ReadRawRC(unsigned char Address)
{
     unsigned char i, ucAddr;
     unsigned char ucResult=0;
     MF522_NSS = 1;   //******不知道是否需要?

     ucAddr = ((Address<<1)&0x7E)|0x80; //地址最高位置1,接下来6位为正常地址,最后一位0
     MF522_MOSI = ((ucAddr&0x80)==0x80);     // 将地址送SI数据线,下降沿接收地址  

     MF522_SCK = 1;//0; 
     nop();
     ucAddr <<= 1;  
     for(i=8;i>0;i--)
     {
          MF522_SCK = 0;//1;
          nop();
          if(i==1)
          {
            MF522_MOSI = 1;  // 将地址送SI数据线,下降沿接收地址
          }
          else
          MF522_MOSI = ((ucAddr&0x80)==0x80);    // 将地址送SI数据线,下降沿接收地址 
          MF522_SCK = 1;//0;
          nop();
          ucAddr <<= 1;          
      }
     MF522_NSS = 0;    //对于单主单从的可以不需要该信号
     nop();

     MF522_SCK = 1;//0;
     nop();
     MF522_NSS = 1;    //对于单主单从的可以不需要该信号
     nop();
     for(i=8;i>0;i--)             //上升沿  从SO数据线发送数据
     {
         ucResult <<= 1;
         ucResult|=MF522_MISO;   //去掉了强制类型转换bit
         MF522_SCK = 0;//1;
         nop();
         MF522_SCK = 1;//0;
         nop();
       }

     MF522_NSS = 0;    //对于单主单从的可以不需要该信号
     nop();
     return ucResult;
}

/////////////////////////////////////////////////////////////////////
//功    能:写RC632寄存器
//参数说明:Address[IN]:寄存器地址
//          value[IN]:写入的值
/////////////////////////////////////////////////////////////////////
void WriteRawRC(unsigned char Address, unsigned char value)
{  
    unsigned char i, ucAddr;
    MF522_NSS = 1;     //******不知道是否需要?


    ucAddr = ((Address<<1)&0x7E);
    MF522_MOSI = ((ucAddr&0x80)==0x80);  // 将地址送SI数据线,下降沿接收地址
    MF522_SCK = 1;//0; 
    nop();
    ucAddr <<= 1;  
    for(i=8;i>0;i--)
    {
          MF522_SCK = 0;//1;
          nop();
          if(i==1)
          {
            MF522_MOSI = 1;  // 将地址送SI数据线,下降沿接收地址
          }
          else
          MF522_MOSI = ((ucAddr&0x80)==0x80);    // 将地址送SI数据线,下降沿接收地址  
          MF522_SCK = 1;//0;
          nop();
          ucAddr <<= 1;          
      }
     MF522_NSS = 0;    //对于单主单从的可以不需要该信号
     nop();

     MF522_NSS = 1;    //对于单主单从的可以不需要该信号
     MF522_MOSI = ((value&0x80)==0x80);
     MF522_SCK = 1;//0; 
     nop();
     value  <<= 1;
     for(i=8;i>0;i--)
     {
         MF522_SCK = 0;//1;
         nop();
         if(i==1)
            MF522_MOSI = 1;  // 将地址送SI数据线,下降沿接收地址
         else
            MF522_MOSI = ((value&0x80)==0x80);   // 将地址送SI数据线,下降沿接收地址  

         MF522_SCK = 1;//0;
         nop();
         value <<= 1;
      }
      MF522_NSS = 0; //对于单主单从的可以不需要该信号
      nop();
}

你可能感兴趣的:(学习)