AS3933软件模拟SPI驱动

2020-01-20 19:14发布

今天在调试AS3933,由于发射端硬件还没做好,接收端的用信号发生器来模拟。经过测试发现AS3933读写正常,特意上传给大家参考下。
#define command  3<<6
#define read     1<<14
#define write    0<<14

#define CS   P13
#define SCL  P14
#define MOSI P15
#define MISO P16

#define wait_cnt1 3

void delay_us(unsigned short cnt)
{
  while(cnt--);
}

void as3933_write_dcommand(unsigned char addr)
{
  unsigned char tmp=0;
  unsigned char i=0;

  addr&=0x3f;
  tmp=addr|command;
  CS=0;
  SCL=0;
  CS=1;
  for(i=0;i<8;i++)
  {                                                         
    if(tmp&(1<<(8-i-1)))
    MOSI=1;
        else
        MOSI=0;
        SCL=1;
        delay_us(wait_cnt1);
        SCL=0;
  }
  MOSI=0;
  delay_us(wait_cnt1);
  CS=0;
}

void as3933_write_byte(unsigned char addr, unsigned char dat)
{
  unsigned short tmp=0;
  unsigned char i=0;

  addr&=0x3f;
  tmp=(((unsigned short)addr)<<8)|dat|write;
  CS=0;
  SCL=0;
  CS=1;
  for(i=0;i<16;i++)
  {                                                         
    if(tmp&((unsigned short)1<<(16-i-1)))
    MOSI=1;
        else
        MOSI=0;
        SCL=1;
        delay_us(wait_cnt1);
        SCL=0;
  }
  MOSI=0;
  delay_us(wait_cnt1);
  CS=0;
}

unsigned char as3933_read_byte(unsigned char addr)
{
  unsigned short tmp=0;
  unsigned char dat=0;
  unsigned char i=0;

  addr&=0x3f;
  tmp=(((unsigned short)addr)<<8)|read;
  CS=0;
  SCL=0;
  CS=1;
  for(i=0;i<8;i++)
  {                                                         
    if(tmp&((unsigned short)1<<(16-i-1)))
    MOSI=1;
        else
        MOSI=0;
        SCL=1;
        delay_us(wait_cnt1);
        SCL=0;
  }
  MOSI=0;
  for(i=0;i<8;i++)
  {               
    SCL=1;
        delay_us(wait_cnt1);
        SCL=0;                                 
    if(MISO)
    dat|=(1<<(8-i-1));
        else
        dat&=~(1<<(8-i-1));
  }
  delay_us(wait_cnt1);
  CS=0;
  return dat;
}
0条回答

一周热门 更多>