IO口模拟SPI

void spi_write_byte(uint addr, uchar dat)
{

   uchar  i;
   spi_sck = 0;
   spi_cs = 0;
   for(i = 0;i < 16;i++)
   {
     spi_sck = 0;        //在spi_sck的上升沿写出一位,高位在前,低位在后
     if(addr & 0x8000)
        spi_sdi  = 1;
     else
        spi_sdi  = 0;
     spi_sck = 1;
     addr<<= 1; 
   }
   for(i = 0;i < 8;i++)
   { 
      spi_sck = 0;      //在spi_sck的上升沿写出一位,高位在前,低位在后
      if(dat & 0x80)
         spi_sdi  = 1;
      else
         spi_sdi  = 0;
      spi_sck = 1;
      dat<<= 1;
   }
   spi_cs = 1;
   
}
#if 0
uchar spi_read_byte(uint addr)
{
   uchar i;
   uchar send_data;
   uchar receive_data;


   addr  &= 0x1FFF;//13bit_address
   addr  |= 0x8000; //read


   spi_sdi = 0;
   spi_cs = 0;
   for(i=0; i<16; i++)
   {
      spi_sck = 0;   //在spi_sck的上升沿写出一位,高位在前,低位在后
 if(addr & 0x8000)
 {
    spi_sdi = 1;
 }else{
    spi_sdi = 0;
 }
 addr <<= 1;
 delay(1);
      spi_sck = 1;
 delay(1);
   }


   send_data = 0x00;
   receive_data = 0x00;
   for(i=0; i<8; i++)
   {
      spi_sck = 0;
 receive_data <<= 1;
 if(spi_sdo)
 {
    receive_data |= 0x01;
 }
 if(send_data & 0x80) //
 {
    spi_sdi = 1;
 }else{
    spi_sdi = 0;
 }
 send_data <<= 1;
 delay(1);
      spi_sck = 1;
 delay(1);
   }
   spi_cs = 1;


   return(receive_data);


}
#else
uchar spi_read_byte(uint addr)
{
   uchar i;
   uchar rx_data;


   addr  &= 0x1FFF;//13bit_address
   addr  |= 0x8000;//read


   spi_sdi = 0;
   spi_cs = 0;
   for(i=0; i<16; i++)
   {
      spi_sck = 0;   //在spi_sck的上升沿写出一位,高位在前,低位在后
 if(addr & 0x8000)
 {
    spi_sdi = 1;
 }else{
    spi_sdi = 0;
 }
 addr <<= 1;
 delay(1);
      spi_sck = 1;
 delay(1);
   }


   rx_data = 0x00;
   for(i=0; i<8; i++)
   {
      spi_sck = 0;
 rx_data <<= 1;
 if(spi_sdo)
 {
    rx_data |= 0x01;
 }
 spi_sdi = 0;
 delay(1);
      spi_sck = 1;
 delay(1);
   }
   spi_cs = 1;


   return(rx_data);


}
#endif

你可能感兴趣的:(单片机)