xieweibiao 发表于 2015-1-18 19:25:48

AS3933软件模拟SPI驱动

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

#define CS   P13
#define SCLP14
#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;
}
页: [1]
查看完整版本: AS3933软件模拟SPI驱动