最经搞一个产品,用到电度表芯片RN7302,在读数据的时候,读出的全部为1,有知道的吗,什么原因?
读取的相关程序如下:
uint32_t readspi(uint16_t spiaddr)
{
uint8_t dat,i,j,sw;
uint32_t rdata=0;
spiaddr=0x130f;//读取bank1的3个字节地址0x0f,应该是0x00808080,作为检测程序用
clrscsn;//拉低SCSN片选
Delay_us(4);
dat=spiaddr;//写地址0xf
for(i=0;i<8;i++)
{
setsclk;//值1clk时钟
if(dat&0x80)
setsdi;//置1sdi//数据1写入RN7302
else
clrsdi; //数据0写入RN7302
Delay_us(4);
clrsclk; //置0clk时钟
dat<<=1;
Delay_us(4);
}
dat=(spiaddr>>8)&0xf0;//写指令0x10
for(i=0;i<8;i++)
{
setsclk;
if(dat&0x80)
setsdi;
else
clrsdi;
Delay_us(4);
clrsclk;
dat<<=1;
Delay_us(4);
}
sw=((spiaddr>>8)&0x0f);//取出读取的字节数0x03
rdata=0;
for(j=0;j<sw;j++)
{
dat=0;
for(i=0;i<8;i++)
{
setsclk;
dat<<=1;
Delay_us(4);
clrsclk;
if(sdo)//从RN7302的SDO读取数据
dat|=0x01;
Delay_us(4);
}
rdata<<=8;
rdata|=dat;//读出的数据是0x00ffffff
}
dat=0;
for(i=0;i<8;i++)//最后读取校验和
{
setsclk;
dat<<=1;
Delay_us(4);
clrsclk;
if(sdo)
dat|=0x01;
Delay_us(4);
}
cs=dat;//读出的数据都是0xff
setscsn;
return rdata;
}
|