我按网上的教程写2.4g无线模块的程序,测试各函数功能时,读写只有一个数据的寄存器时返回值正常,但按网上的的方法写的读有多位数据的寄存器时就读不出来的,我找了好几个例程,基本都是类似写法啊,按程序上返回值是07 00 00 00 00 00 ,前面07正常,后面的几个0全是默认值啊,正常应该是e7e7e7e7e7e7来着,帮忙给看看那里出错了蓝字部分是读写多个字节的程序,谢谢了
#include <STC15W4K60S2.h>
#include <intrins.h>
sbit csn=P5^5;
sbit ce=P5^4;
sbit irq=P3^2;
unsigned char status;
void UartInit(void) //115200bps@22MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xD0; //设定定时初值
TH1 = 0xFF; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void Delay() //10微秒@22.1184MHz
{
unsigned char i;
_nop_();
_nop_();
_nop_();
i = 52;
while (--i);
}
void Delay100us() //@22.1184MHz
{
unsigned char i, j;
i = 3;
j = 35;
do
{
while (--j);
} while (--i);
}
void spiInit(void)
{
SPCTL=0xd3;//spi功能设置
SPSTAT |= 0XC0;//写1清0两个标记位
IE2&=0;
}
/*******************************************/
/* spi写入/读取程序 */
/*******************************************/
unsigned char spi_rw(unsigned char tr_data)
{
unsigned char i=0;
SPSTAT |= 0Xc0; // 清高两位,
SPDAT=tr_data;
while(((SPSTAT&0X80)!=0X80)&&(i<20))
{
i++;
// Delay();
}
return SPDAT;
}
/******************************************/
/* 用spi读一个寄存器字节 */
/*****************************************/
unsigned char spi_read(unsigned char reg)//reg 是寄存器地址
{
unsigned char reg_zhi;
csn=0;
spi_rw(reg); //reg指令
reg_zhi=spi_rw(0);//读reg值到reg_zhi
csn=1;
return reg_zhi;
}
/********************************************/
/* 写一个字节到寄存器 */
/********************************************/
unsigned char spi_rw_reg(unsigned char reg ,unsigned char zhi)
{
unsigned char status;
csn=0;
status=spi_rw(reg);//写指令并读status
spi_rw(zhi);//写值到reg寄存器
csn=1;
return status;
}
/*************************************************/
/* 从寄存器读多个字节
/* reg 是寄存器地址,*pbuf是待读数据的地址? */
/* geshu是读出数据的个数? */
/*************************************************/
unsigned char spi_read_buf(unsigned char reg,unsigned char *pbuf, unsigned char geshu)
{
unsigned char status, i;
csn=0;
status=spi_rw(reg);
for(i=0;i<geshu;i++);
pbuf=spi_rw(0);
csn=1;
return status;
}
/***********************************************************/
/* 向寄存器写入多个字节 */
/* reg 是寄存器地址,*pbuf是数据要写入的地方geshu是数据的个数*/
/**********************************************************/
unsigned char spi_write_buf(unsigned char reg,unsigned char *pbuf,unsigned char geshu)
{
unsigned char status,i;
csn=0;
status=spi_rw(reg);
for(i=0;i<geshu;i++);
spi_rw(*pbuf++);
csn=1;
return status;
}
/*************************************************/
/* 主程序 */
/*************************************************/
void main()
{
unsigned char addr[5]={0,0,0,0,0,};
ce=0;
csn=0;
irq=1;
status=0;
UartInit();
spiInit();
Delay();
while(1)
{
if(RI)
{
spi_rw_reg(0x35,0x7);
status=spi_read(0x15);//读寄存器0x0的值
SBUF=status;
TI=0;
Delay100us();
spi_read_buf(0x10,addr,5);//读寄存器0x10(发射地址寄存器的内容)地址是5个字节
Delay100us();
SBUF=addr[0];
Delay100us();
SBUF=addr[1];
Delay100us();
SBUF=addr[2];
Delay100us();
SBUF=addr[3];
Delay100us();
SBUF=addr[4];
RI=0;
}
}
}
|