Moderadores: andre_luis, 51
B-EAGLE escreveu:tá tendo problema exatamente onde?
dá uma olhada nos firmwares exemplos que tem no site da texas... são bons e funfam certinho:
http://www.ti.com/litv/zip/swrc021f
void envia_byte(unsigned char);
void configura_CC1100();
void CC1100_reset();
void transmite_pacote(unsigned char*,unsigned short);
char recebe_pacote(unsigned char*,unsigned char*);
char le_status_reg_CC1100(unsigned char);
char le_reg_CC1100(unsigned char);
void le_burst_reg_CC1100(unsigned char, unsigned char*, unsigned char);
void transmite_pacote(unsigned char *txBuf, unsigned short sz){
unsigned short i;
ok = 1;
CSn = 0;
while(SO);
SPDR = 0x3F | 0x40; //0x3F > endereço do FIFO TX; 0x40 > bit para acesso por BURST
while (ok);
for (i = 0; i < sz; i++){
ok = 1;
SPDR = txBuf[i];
while(ok);
}
CSn = 1;
delay(2);
envia_byte(0x35); //STROBE para entrar no modo TX
while(!GDO0); //espera GDO0 ir para 1
while(GDO0); //espera GDO0 ir para 0
return;
}
void CC1100_reset(){ //CC1100 datasheet pg.42
SCLK = 1; //put SLCK in 1 and SI in 0 to avoid potential problems with pin control mode
CSn = 0;
_nop_();
_nop_();
_nop_();
_nop_();
CSn = 1;
delay(1);
CSn = 0;
while(SO);
envia_byte(0x30);
delay(10);
CSn = 1;
return;
}
void envia_byte(unsigned char bt){
ok = 1;
CSn = 0;
SPDR = bt;
while(ok); //o bit de interrupção SPIF_ é colocado em 0 novamente quando o valor de SPDR é lido/escrito;
CSn = 1;
return;
}
void envia_reg(unsigned char addr, unsigned char value){
ok = 1;
CSn = 0;
while(SO);
SPDR = addr;
while(ok);
ok = 1;
SPDR = value;
while(ok);
CSn = 1;
return;
}
void configura_CC1100(){
envia_reg(0x0B,0x0A); //FSCTRL1
envia_reg(0x0C,0x00); //FSCTRL0
envia_reg(0x0D,0x10); //FREQ2
envia_reg(0x0E,0xA7); //FREQ1
envia_reg(0x0F,0x62); //FREQ0
envia_reg(0x10,0x2D); //MDMCFG4
envia_reg(0x11,0x3B); //MDMCFG3
envia_reg(0x12,0x73); //MDMCFG2
envia_reg(0x13,0x22); //MDMCFG1
envia_reg(0x14,0xF8); //MDMCFG0
envia_reg(0x0A,0x00); //CHNNR (channel number)
envia_reg(0x15,0x00); //DEVIATN
envia_reg(0x21,0xB6); //FREND1
envia_reg(0x22,0x10); //FREND0
envia_reg(0x18,0x18); //MCSM0
envia_reg(0x19,0x1D); //FOCCFG
envia_reg(0x1A,0x1C); //BSCFG
envia_reg(0x1B,0xC7); //AGCCTRL2
envia_reg(0x1C,0x00); //AGCCTRL1
envia_reg(0x1D,0xB2); //AGCCTRL0
envia_reg(0x23,0xEA); //FSCAL3
envia_reg(0x24,0x2A); //FSCAL2
envia_reg(0x25,0x00); //FSCAL1
envia_reg(0x26,0x1F); //FSCAL0
envia_reg(0x29,0x59); //FSTEST
envia_reg(0x2C,0x88); //TEST2
envia_reg(0x2D,0x31); //TEST1
envia_reg(0x2E,0x09); //TEST0
envia_reg(0x00,0x0B); //IOCFG2
envia_reg(0x02,0x06); //IOCFG0
envia_reg(0x07,0x04); //PKTCTRL1
envia_reg(0x08,0x05); //PKTCTRL0
envia_reg(0x09,0x00); //ADDR
envia_reg(0x06,0xFF); //PKTLEN
//envia_reg(0x01,0x0B); //IOCFG1
envia_reg(0x3E,0x60); //paTable (output power signal) (0xC0 = 10dBm; 0x60 = 0dBm)
return;
}
char recebe_pacote(unsigned char *rxBuf, unsigned char *tamanho){
unsigned char pktLength;
unsigned char sts[2];
envia_byte(0x34); //strobe para entrar no modo RX
while(!GDO0); //espera GDO0 pulsar em nivel baixo
while(GDO0);
if ((le_status_reg_CC1100(0x3B) & 0x7F)){ //0x3B = RXBYTES -- os sete bits menos significativos são a quantidade de bytes no fifo
pktLength = le_reg_CC1100(0x3F); //0x3F = endereço do RXFIFO
if (pktLength <= *tamanho){
le_burst_reg_CC1100(0x3F,rxBuf,pktLength);
*tamanho = pktLength;
le_burst_reg_CC1100(0x3F,sts,2);
return (sts[1] & 0x80); //bit mais significativo do byte é o indicador de CRC OK
}
else{
*tamanho = pktLength;
envia_byte(0x36); //strobe para entrar no modo IDLE
envia_byte(0x3A); //strobe de flush RX FIFO
return 0;
}
}
else return 0;
}
void le_burst_reg_CC1100(unsigned char addr, unsigned char *rxBuf, unsigned char count){
unsigned short i;
ok = 1;
CSn = 0;
while(SO);
SPDR = (addr | 0xC0); //0xC0 = bit para leitura em burst
while(ok);
for(i = 0; i < count; i++){
ok = 1;
SPDR = 0;
while(ok);
rxBuf[i] = dr;
}
CSn = 1;
return;
}
char le_reg_CC1100(unsigned char addr){
char res;
ok = 1;
CSn = 0;
while(SO);
SPDR = (addr | 0x80); //0x80 = bit para leitura de um byte somente
while(ok);
ok = 1;
SPDR = 0;
while(ok);
res = dr;
CSn = 1;
return res;
}
char le_status_reg_CC1100(unsigned char addr){
char res;
ok = 1;
CSn = 0;
while(SO);
SPDR = (addr | 0xC0); //0xC0 = bit para leitura em burst
while(ok);
ok = 1;
SPDR = 0; //valor qualquer para obter o byte de retorno do chip
while(ok);
res = dr;
CSn = 0;
return res;
}
xultz escreveu:A respeito dos componentes discretos do balun, eu recomendo pegar a app note e comprar exatamente os mesmos (usando o part number da Murata), eu uma vez troquei um único indutor por um genérico e o alcance foi pro saco. Hoje eu compro da Digikey e usando o mesmo part number (dependendo do meu estado de humor, eu compro o equivalente em 0603, sneão compro 0402 mesmo igual do documento).
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante