#define uchar unsigned char
uchar dataH,dataL;//定义全局变量用来保存数据 /*脚位定义*/
sbit SPI_CLK = P1^4; sbit SPI_MISO = P1^5; sbit SPI_MOSI = P2^2; sbit SPI_SS = P2^3;//片选 sbit LT_RESET_N = P2^4;
sbit LT_PKT_FLAG = P2^5;//LT8900 pkt脚
uchar RX_data[8];//定义数据缓冲区,保存LT8900收到的数据 /*从8900读一个字节*/ uchar SPI_read8bit() { uchar i,data; for(i=0;i<8;i++) { data=data<<1; SPI_CLK=1; _NOP(); //空指令,稍微延时一下 _NOP(); _NOP(); SPI_CLK=0; if(SPI_MISO==1) data=data|0x01; if(SPI_MISO==0) data=data|0x00; } return data; }
/*往8900写一个字节*/
void SPI_write8bit(uchar data) { uchar i; for(i=0;i<8;i++) { data=data<<1; SPI_CLK=1; _NOP(); _NOP(); _NOP(); SPI_MOSI=C; SPI_CLK=0;
1
} } /*
*从地址addr读数据,LT8900寄存器是16位的, *hdata用来保存高8位,ldata用来保存低8位 */
void LT8900_writeReg(uchar add,uchar hdata,uchar ldata) {
SPI_SS=0;//拉低LT8900使能脚,使能LT8900 _NOP();
SPI_write8bit(add&0X7F);//地址最高位0表示写 _NOP(); _NOP();
SPI_write8bit(hdata); SPI_write8bit(ldata); _NOP();
SPI_SS=1;//完毕重新拉高LT8900使能脚 }
void LT8900_readReg(uchar add) { SPI_SS=0; //拉低LT8900使能脚,使能LT8900 _NOP(); SPI_write8bit(add|0x80);//地址最高位1表示读 _NOP(); _NOP(); dataH=SPI_read8bit();//data high byte dataL=SPI_read8bit();//data low byte _NOP(); SPI_SS=1; //完毕重新拉高LT8900使能脚 }
/*以上4个函数就是LT8900最底层的4个函数,应用程序可以直接调用。*/
void delayms(uchar ms) { uchar i,j; for(i=0;i /*以下是LT8900接收的初始化代码*/ void LT8900_RX_INIT(void) 2 { } LT_RESET_N=0; //关闭芯片 delayms(10); LT_RESET_N=1; //开启芯片,寄存器复位 delayms(50); LT8900_writeReg(0, 0x6f, 0xe0); LT8900_writeReg(1, 0x56, 0x81); LT8900_writeReg(2, 0x66, 0x17); LT8900_writeReg(4, 0x9c, 0xc9); LT8900_writeReg(5, 0x66, 0x37); LT8900_writeReg(7, 0x00, 0x4c); LT8900_writeReg(8, 0x6C, 0x90); LT8900_writeReg(9, 0x18, 0x40); LT8900_writeReg(10, 0x7F, 0xFD); LT8900_writeReg(11, 0x00, 0x08); LT8900_writeReg(12, 0x00, 0x00); LT8900_writeReg(13, 0x48, 0xBD); LT8900_writeReg(22, 0x00, 0xff); LT8900_writeReg(23, 0x80, 0x05); LT8900_writeReg(24, 0x00, 0x67); LT8900_writeReg(25, 0x16, 0x59); LT8900_writeReg(26, 0x19, 0xE0); LT8900_writeReg(27, 0x13, 0x00); LT8900_writeReg(28, 0x18, 0x00); LT8900_writeReg(32, 0x48, 0x00); LT8900_writeReg(33, 0x3f, 0xC7); LT8900_writeReg(34, 0x20, 0x00); LT8900_writeReg(35, 0x03, 0x00); LT8900_writeReg(36, 0x05, 0x0A); LT8900_writeReg(39, 0x55, 0xAA); LT8900_writeReg(40, 0x44, 0x01); LT8900_writeReg(41, 0xB0, 0x00); LT8900_writeReg(42, 0xFD, 0xB0); LT8900_writeReg(43, 0x00, 0x0F); LT8900_writeReg(50, 0x00, 0x00); LT8900_writeReg(52, 0x80, 0x80); LT8900_writeReg(7, 0x00, 0X84); delayms(50);//delay 50ms to let LT8900 for operation 3 接收的应用程序可以这样写: Void main(void) { int i; LT8900_RX_INIT(); While(1) { if(LT_PKT_FLAG==1) //如果LT8900的PKT脚被拉高,说明收到了数据 { /* Register 52 的bit8~13将指示收到多少字节数据,一般来说发端发送多少个字节的数据是确定的,读这个字节用来校验收到的数据包数据长度是否正确*/ LT8900_readReg(52); if((dataH&0x3f) == 8)//这里假定发端发的是8个字节的数据包 { SPI_SS=0; //使能8900 /*向LT8900的Register50发送读命令*/ SPI_write8bit(50|0x80); _NOP(); _NOP(); _NOP(); _NOP(); for(i=0;i<8;i++) { } RX_data[i]=SPI_read8bit(); //将8字节数据全部读出 _NOP(); _NOP(); } SPI_SS=1; /*以下两步是必须的,1.清空FIFO,2.重新设置频道,LT8900再次进入接收状态*/ LT8900_writeReg(52, 0x80, 0x80); LT8900_writeReg(7, 0x00, 0X84); } /*接下来就可以根据收到的数据(在数组RX_data中),去干你想干的事情了*/ …… } } 4 /*以下是LT8900发送的初始化代码*/ void LT8900_TX_INIT(void) { } LT_RESET_N=0; //关闭芯片 delayms(10); LT_RESET_N=1; //开启芯片,寄存器复位 delayms(50); LT8900_writeReg(0, 0x6f, 0xe0); LT8900_writeReg(1, 0x56, 0x81); LT8900_writeReg(2, 0x66, 0x17); LT8900_writeReg(4, 0x9c, 0xc9); LT8900_writeReg(5, 0x66, 0x37); LT8900_writeReg(7, 0x00, 0x4c); LT8900_writeReg(8, 0x6C, 0x90); LT8900_writeReg(9, 0x18, 0x40); LT8900_writeReg(10, 0x7F, 0xFD); LT8900_writeReg(11, 0x00, 0x08); LT8900_writeReg(12, 0x00, 0x00); LT8900_writeReg(13, 0x48, 0xBD); LT8900_writeReg(22, 0x00, 0xff); LT8900_writeReg(23, 0x80, 0x05); LT8900_writeReg(24, 0x00, 0x67); LT8900_writeReg(25, 0x16, 0x59); LT8900_writeReg(26, 0x19, 0xE0); LT8900_writeReg(27, 0x13, 0x00); LT8900_writeReg(28, 0x18, 0x00); LT8900_writeReg(32, 0x48, 0x00); LT8900_writeReg(33, 0x3f, 0xC7); LT8900_writeReg(34, 0x20, 0x00); LT8900_writeReg(35, 0x03, 0x00); LT8900_writeReg(36, 0x05, 0x0A); LT8900_writeReg(39, 0x55, 0xAA); LT8900_writeReg(40, 0x44, 0x01); LT8900_writeReg(41, 0xB0, 0x00); LT8900_writeReg(42, 0xFD, 0xB0); LT8900_writeReg(43, 0x00, 0x0F); LT8900_writeReg(50, 0x00, 0x00); LT8900_writeReg(52, 0x80, 0x80); LT8900_writeReg(7, 0x01, 0x04); delayms(50);//delay 50ms to let LT8900 for operation 5 /*LT8900发送的一个应用程序*/ uchar TX_data[8]; void main(void) { int i; LT8900_TX_INIT(); While(1) { if(/*这里是你要发送的条件,条件成立就进去发送*/) { ……//首先把你要发送的数据填充到数组TX_data,如TX_data[0] = 0x07,TX_data[1]=0x5a,……. } } } LT8900_writeReg(7, 0x00, 0X00); //stop tx,停止发送 LT8900_writeReg(52, 0x80, 0x80); //清空FIFO SPI_SS=0; //使能8900 SPI_write8bit(50|0x7f);//表示要往register50写数据 for(i=0;i<8;i++) SPI_write8bit(TX_data[i]);//将数据全部写进FIFO SPI_SS=1; LT8900_writeReg(7, 0x01, 0X04);//重新设置发送频道并使能发送, while(LT_PKT_FLAG == 0);等待PKT拉高(发送完成PKT被拉高) 6