Witam, pisze z następującym problemem nie mogę nawiązać komunikacji z cc1100 kiedy próbuje odczytać wartość jakiegoś rejestru dostaje same 0 co pewnie oznacza też że to co próbuje mu wpisać do niego też nie dochodzi.... Przy pisaniu programu posiłkuje się artykułem z elektroniki praktycznej 3/2008 gdzie opisali ten układ. W artykule przykłady pisane są pod Atiny, ja staram się go przerobić pod arduino(w moim przypadku pro mikro) program pisze w arduino IDE (co zresztą widać) oraz używam konwerterów poziomów logicznych.
Linki do artykułów:
http://ep.com.pl/files/2961.pdf
http://ep.com.pl/files/2998.pdf
http://ep.com.pl/files/3029.pdf
http://ep.com.pl/files/3039.pdf
// rejestry konfiguracyjne
#define IOCFG0 B00000010 //0x02; //06 GDO0 Output Pin Configuration
#define PKTCTRL0 B00001000 //0x08; //05 Packet Automation Control
#define FSCTRL1 B00001011 //0x0B; //06 Frequency Synthesizer Control
#define FREQ2 B00001101 //0x0D; //21 Frequency Control Word, High Byte
#define FREQ1 B00001110 //0x0E; //62 Frequency Control Word, Middle Byte
#define FREQ0 B00001111 //0x0F; //76 Frequency Control Word, Low Byte
#define MDMCFG4 B00010000 //0x10; //F6 Modem Configuration
#define MDMCFG3 B00010001 //0x11; //83 Modem Configuration
#define MDMCFG2 B00010010 //0x12; //03 Modem Configuration
#define DEVIATN B00010101 //0x15; //15 Modem Deviation Setting
#define MCSM0 B00011000 //0x18; //18 Main Radio Control State Machine Configuration
#define FOCCFG B00011001 //0x19; //16 Frequency Offset Compensation Configuration
#define FSCAL3 B00100011 //0x23; //E9 Frequency Synthesizer Calibration
#define FSCAL2 B00100100 //0x24; //2A Frequency Synthesizer Calibration
#define FSCAL1 B00100101 //0x25; //00 Frequency Synthesizer Calibration
#define FSCAL0 B00100110 //0x26; //1F Frequency Synthesizer Calibration
#define TEST2 B00101100 //0x2C; //81 Various Test Settings
#define TEST1 B00101101 //0x2D; //35 Various Test Settings
#define TEST0 B00101110 //0x2E; //09 Various Test Settings
//komendy
#define SRES 0x30 //komenda zerowania układu TRX
#define SRX 0x34 //tryb odbiorczy
#define SIDLE 0x36
int clock=15;
int slave=10;
int miso=14;
int mosi=16;
byte dana=15;
void setup (void)
{
pinMode(clock, OUTPUT);
pinMode(slave, OUTPUT);
pinMode(miso, INPUT);
pinMode(mosi, OUTPUT);
Serial.begin(9600);
}
void loop (void)
{
zerowanie();
start_rejestr();
czytaj();
}
// procedura zerowania
void zerowanie()
{
//ssynchronizacja układów
digitalWrite(clock, HIGH);
digitalWrite(slave, LOW);
digitalWrite(mosi, LOW);
//delay(1);
digitalWrite(slave, HIGH);
digitalWrite(clock, LOW);
delay(40);
digitalWrite(slave, LOW);
while((digitalRead(miso))!=LOW);
//wysłanie polecenia zerowania do TRX
shiftOut(mosi,clock,MSBFIRST,SRES);
digitalWrite(slave, HIGH);
while(digitalRead(miso)==LOW);
while(digitalRead(miso)!=LOW);
digitalWrite(slave, HIGH);
}
//zapisuje wartości do rejestru TRX
void zapis( byte adres, byte wartosc){
digitalWrite(clock, LOW);
digitalWrite(slave, LOW);
while(digitalRead(miso)!=LOW);
shiftOut(mosi, clock, MSBFIRST, adres);// podaje adres
__asm__("nop\n\t");
shiftOut(mosi, clock, MSBFIRST, wartosc);// podaje wartość do zapisu pod wskazany adres
digitalWrite(slave, HIGH);
}
//wprowadza wartosci startowe do rejestrów
void start_rejestr()
{
zapis(IOCFG0,0x06);
zapis(PKTCTRL0,0x05);
zapis(FSCTRL1,0x06);
zapis(FREQ2,0x21);
zapis(FREQ1,0x62);
zapis(FREQ0,0x76);
zapis(MDMCFG4,0xF6);
zapis(MDMCFG3,0x83);
zapis(MDMCFG2,0x03);
zapis(DEVIATN,0x15);
zapis(MCSM0,0x18);
zapis(FOCCFG,0x16);
zapis(FSCAL3,0xE9);
zapis(FSCAL2,0x2A);
zapis(FSCAL1,0x00);
zapis(FSCAL0,0x1F);
zapis(TEST2,0x81);
zapis(TEST1,0x35);
zapis(TEST0,0x09);
}
void czytaj()
{
digitalWrite(clock, LOW);
digitalWrite(slave, LOW);
while(digitalRead(miso)!=LOW);
shiftOut(mosi, clock, MSBFIRST, B10000010);// podaje adres
__asm__("nop\n\t");
dana= shiftIn(miso, clock, MSBFIRST);
digitalWrite(slave, HIGH);
Serial.println(dana);
}
w tym miejscu kod utyka ponieważ niemożne się doczekać zmiany sygnału od TRX'a
while(digitalRead(miso)==LOW);
while(digitalRead(miso)!=LOW);
W celach testowych chciałem odczytać wartość rejestru 000010, domyślnie ma on wartość 0x3F a próbuje mu wpisać 0x06 natomiast otrzymuje same 0 co pewnie wiąże się z tym że, układ nic nie wystawia na linie i po prostu sczytuje jeden ciągły stan jaki na niej jest.
Widzę, że dużo ludzi ma problem z tym układem więc liczę na pomoc ludzi którzy już przez to przebrnęli i z góry za nią dziękuje.