现在的位置: 首页 > 综合 > 正文

IO口模拟SPI

2018年02月01日 ⁄ 综合 ⁄ 共 1439字 ⁄ 字号 评论关闭

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

【上篇】
【下篇】

抱歉!评论已关闭.