|
Мои мучения с CC2500 |
|
|
|
Jun 12 2009, 06:37
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Господа. Начал я мучиться с сс2500. Спаял две платки - одну отладочную, на ней контроллер mega32L, на другой собственно чип. Не могу прочитать регистры. Нет ответа от чипа. Ну как всегда, 3 версии: - горелый чип - ошибки монтажа - ошибка программы. 1 первую версию проверить не представляется возможным, пока нет уверенности во второй и третьей. Ошибки монтажа: сигналы на чип точно поступают, включал MOSI, MISO и SCK и мерял напряжение непосредственно на ножке чипа. Везде единицы. Прозванивал цепь от SO чипа до MISO контроллера - связь есть. Питание тоже в порядке. Теоретически может быть непропай контактной площадки под CC2500 и контактных площадок под кварцем, внимание вопрос - это может быть причиной неработоспособнотси цифровой интерфейсной части чипа? Вообще для того чтобы читать регистры хватит ли подключения сигнальных линий и питания при игнорировании остальных выводов? Ошибка программы. Использую готовый проект для mega88, немного переделал его под mega32L, питание 3,24 вольт. В оригинальном проекте кварц был на 14мгц, у меня же 8 Мгц. По идее не должно сказываться на SPI, ибо он программный, я правильно понял? Далее на отладочной плате сидит дисплей от S65 он использует аппаратный SPI, на его же ноги я назначил программный SPI от чипа, CS линии естественно, раздельные, может ли это быть причиной? Сам дисплей, а следовательно и аппаратный SPI для него инициализируются после чтения регистра, так что конфликт исключен, тем более, что дисплей не имеет выхода MOSI и на поток данных он влиять никак не может. Весь проект приводить смысла нет, там шаманство с USART и прерываниями, которые я отключил для чистоты эксперимента. Приведу лишь функции, которые работают: основной файл: Код #include <mega32.h> #include <delay.h> #include <string.h> #include <stdlib.h> #include <ctype.h>
#include "TI_CC_spi.h" #include "TI_CC_spi.c"
void main () { char str;
TI_CC_SPISetup(); // Initialize SPI port
TI_CC_PowerupResetCCxxxx(); // Reset CCxxxx writeRFSettings(); // Write RF settings to config reg TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE,paTable,paTableLen );//Write PATABLE TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); TI_CC_SPIStrobe(TI_CCxxx0_SFRX); TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
str=TI_CC_SPIReadReg(TI_CCxxx0_PARTNUM);
lcd_str_ram(str,f8x14,red); // строки инициализации дисплея опущены.
} файл TI_CC_spi.h Код #define mosi PORTB.5 #define miso PINB.6 #define sck PORTB.7 #define cs PORTB.1 #define gdo2 PIND.2 #define gdo0 PIND.3 #define light PORTD.4
// Configuration Registers #define TI_CCxxx0_IOCFG2 0x00 // GDO2 output pin configuration #define TI_CCxxx0_IOCFG1 0x01 // GDO1 output pin configuration #define TI_CCxxx0_IOCFG0 0x02 // GDO0 output pin configuration #define TI_CCxxx0_FIFOTHR 0x03 // RX FIFO and TX FIFO thresholds #define TI_CCxxx0_SYNC1 0x04 // Sync word, high byte #define TI_CCxxx0_SYNC0 0x05 // Sync word, low byte #define TI_CCxxx0_PKTLEN 0x06 // Packet length #define TI_CCxxx0_PKTCTRL1 0x07 // Packet automation control #define TI_CCxxx0_PKTCTRL0 0x08 // Packet automation control #define TI_CCxxx0_ADDR 0x09 // Device address #define TI_CCxxx0_CHANNR 0x0A // Channel number #define TI_CCxxx0_FSCTRL1 0x0B // Frequency synthesizer control #define TI_CCxxx0_FSCTRL0 0x0C // Frequency synthesizer control #define TI_CCxxx0_FREQ2 0x0D // Frequency control word, high byte #define TI_CCxxx0_FREQ1 0x0E // Frequency control word, middle byte #define TI_CCxxx0_FREQ0 0x0F // Frequency control word, low byte #define TI_CCxxx0_MDMCFG4 0x10 // Modem configuration #define TI_CCxxx0_MDMCFG3 0x11 // Modem configuration #define TI_CCxxx0_MDMCFG2 0x12 // Modem configuration #define TI_CCxxx0_MDMCFG1 0x13 // Modem configuration #define TI_CCxxx0_MDMCFG0 0x14 // Modem configuration #define TI_CCxxx0_DEVIATN 0x15 // Modem deviation setting #define TI_CCxxx0_MCSM2 0x16 // Main Radio Cntrl State Machine config #define TI_CCxxx0_MCSM1 0x17 // Main Radio Cntrl State Machine config #define TI_CCxxx0_MCSM0 0x18 // Main Radio Cntrl State Machine config #define TI_CCxxx0_FOCCFG 0x19 // Frequency Offset Compensation config #define TI_CCxxx0_BSCFG 0x1A // Bit Synchronization configuration #define TI_CCxxx0_AGCCTRL2 0x1B // AGC control #define TI_CCxxx0_AGCCTRL1 0x1C // AGC control #define TI_CCxxx0_AGCCTRL0 0x1D // AGC control #define TI_CCxxx0_WOREVT1 0x1E // High byte Event 0 timeout #define TI_CCxxx0_WOREVT0 0x1F // Low byte Event 0 timeout #define TI_CCxxx0_WORCTRL 0x20 // Wake On Radio control #define TI_CCxxx0_FREND1 0x21 // Front end RX configuration #define TI_CCxxx0_FREND0 0x22 // Front end TX configuration #define TI_CCxxx0_FSCAL3 0x23 // Frequency synthesizer calibration #define TI_CCxxx0_FSCAL2 0x24 // Frequency synthesizer calibration #define TI_CCxxx0_FSCAL1 0x25 // Frequency synthesizer calibration #define TI_CCxxx0_FSCAL0 0x26 // Frequency synthesizer calibration #define TI_CCxxx0_RCCTRL1 0x27 // RC oscillator configuration #define TI_CCxxx0_RCCTRL0 0x28 // RC oscillator configuration #define TI_CCxxx0_FSTEST 0x29 // Frequency synthesizer cal control #define TI_CCxxx0_PTEST 0x2A // Production test #define TI_CCxxx0_AGCTEST 0x2B // AGC test #define TI_CCxxx0_TEST2 0x2C // Various test settings #define TI_CCxxx0_TEST1 0x2D // Various test settings #define TI_CCxxx0_TEST0 0x2E // Various test settings
// Strobe commands #define TI_CCxxx0_SRES 0x30 // Reset chip. #define TI_CCxxx0_SFSTXON 0x31 // Enable/calibrate freq synthesizer #define TI_CCxxx0_SXOFF 0x32 // Turn off crystal oscillator. #define TI_CCxxx0_SCAL 0x33 // Calibrate freq synthesizer & disable #define TI_CCxxx0_SRX 0x34 // Enable RX. #define TI_CCxxx0_STX 0x35 // Enable TX. #define TI_CCxxx0_SIDLE 0x36 // Exit RX / TX #define TI_CCxxx0_SAFC 0x37 // AFC adjustment of freq synthesizer #define TI_CCxxx0_SWOR 0x38 // Start automatic RX polling sequence #define TI_CCxxx0_SPWD 0x39 // Enter pwr down mode when CSn goes hi #define TI_CCxxx0_SFRX 0x3A // Flush the RX FIFO buffer. #define TI_CCxxx0_SFTX 0x3B // Flush the TX FIFO buffer. #define TI_CCxxx0_SWORRST 0x3C // Reset real time clock. #define TI_CCxxx0_SNOP 0x3D // No operation.
// Status registers #define TI_CCxxx0_PARTNUM 0x30 // Part number #define TI_CCxxx0_VERSION 0x31 // Current version number #define TI_CCxxx0_FREQEST 0x32 // Frequency offset estimate #define TI_CCxxx0_LQI 0x33 // Demodulator estimate for link quality #define TI_CCxxx0_RSSI 0x34 // Received signal strength indication #define TI_CCxxx0_MARCSTATE 0x35 // Control state machine state #define TI_CCxxx0_WORTIME1 0x36 // High byte of WOR timer #define TI_CCxxx0_WORTIME0 0x37 // Low byte of WOR timer #define TI_CCxxx0_PKTSTATUS 0x38 // Current GDOx status and packet status #define TI_CCxxx0_VCO_VC_DAC 0x39 // Current setting from PLL cal module #define TI_CCxxx0_TXBYTES 0x3A // Underflow and # of bytes in TXFIFO #define TI_CCxxx0_RXBYTES 0x3B // Overflow and # of bytes in RXFIFO #define TI_CCxxx0_NUM_RXBYTES 0x7F // Mask "# of bytes" field in _RXBYTES
// Other memory locations #define TI_CCxxx0_PATABLE 0x3E #define TI_CCxxx0_TXFIFO 0x3F #define TI_CCxxx0_RXFIFO 0x3F
// Masks for appended status bytes #define TI_CCxxx0_LQI_RX 0x01 // Position of LQI byte #define TI_CCxxx0_CRC_OK 0x80 // Mask "CRC_OK" bit within LQI byte
// Definitions to support burst/single access: #define TI_CCxxx0_WRITE_BURST 0x40 #define TI_CCxxx0_READ_SINGLE 0x80 #define TI_CCxxx0_READ_BURST 0xC0
// PATABLE (0 dBm output power) char paTable[] = {0xff}; char paTableLen = 1;
void TI_CC_SPISetup(void); void TI_CC_PowerupResetCCxxxx(void); void TI_CC_SPIWriteReg(char, char); void TI_CC_SPIWriteBurstReg(char, char*, char); char TI_CC_SPIReadReg(char); void TI_CC_SPIReadBurstReg(char, char *, char); char TI_CC_SPIReadStatus(char); void TI_CC_SPIStrobe(char); void RFSendPacket(char *txBuffer, char size); void writeRFSettings(void); char RFReceivePacket(char *rxBuffer, char *length); void RF_TX_proc(void); void RF_RX_proc(void); функции из TI_CC_spi.c Код void TI_CC_SPISetup(void) { DDRB.5=1; // MOSI в out DDRB.1=1; // CS в out DDRB.6=0; // MISO в in DDRB.7=1; // SCK в out cs=1; sck=0; mosi=0; }
// Output eight-bit value using selected bit-bang pins void TI_CC_SPI_bitbang_out(char value) { char x;
for(x=8;x>0;x--){ if(value & 0x80)mosi=1; else mosi=0; #asm("nop") sck=1; value<<=1; #asm("nop") sck=0; #asm("nop") } }
// Input eight-bit value using selected bit-bang pins char TI_CC_SPI_bitbang_in() { unsigned char x=0; unsigned char y; x=0; for(y=8;y>0;y--){ sck=1; #asm("nop") x<<=1; if(miso==1){x|=0b00000001;} sck=0; #asm("nop") } // Store next bit return(x);
}
void TI_CC_SPIWriteReg(char addr, char value) { cs=0; // /CS enable while (miso); // Wait CCxxxx ready TI_CC_SPI_bitbang_out(addr); // Send address TI_CC_SPI_bitbang_out(value); // Send data cs=1; // /CS disable }
void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count) { char i;
cs=0; // /CS enable while (miso); // Wait CCxxxx ready TI_CC_SPI_bitbang_out(addr | TI_CCxxx0_WRITE_BURST); // Send address for (i = 0; i < count; i++) TI_CC_SPI_bitbang_out(buffer[i]); // Send data cs=1; // /CS disable }
char TI_CC_SPIReadReg(char addr) { char x;
cs=0; while (miso); TI_CC_SPI_bitbang_out(addr | TI_CCxxx0_READ_SINGLE);//Send address x = TI_CC_SPI_bitbang_in(); // Read data cs=1; // /CS disable return x; }
void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count) { char i; cs=0; while (miso); TI_CC_SPI_bitbang_out(addr | TI_CCxxx0_READ_BURST); // Send address for (i = 0; i < count; i++){ buffer[i] = TI_CC_SPI_bitbang_in();// Read data } cs=1; // /CS disable }
char TI_CC_SPIReadStatus(char addr) { char x; cs=0; while (miso); // Wait CCxxxx ready // /CS enable TI_CC_SPI_bitbang_out(addr | TI_CCxxx0_READ_BURST); // Send address x = TI_CC_SPI_bitbang_in(); // Read data cs=1; // /CS disable return x; }
void TI_CC_SPIStrobe(char strobe) { cs=0; while (miso); // Wait CCxxxx ready // /CS enable TI_CC_SPI_bitbang_out(strobe); // Send strobe cs=1; // /CS disable }
void TI_CC_PowerupResetCCxxxx(void) { cs=1; delay_us(40); cs=0; delay_us(40); cs=1; delay_us(45); cs=0; while(miso); TI_CC_SPI_bitbang_out(TI_CCxxx0_SRES); while(miso); cs=1; delay_ms(45); }
// Chipcon // Product = CC2500 // Chip version = E // Crystal accuracy = 10 ppm // X-tal frequency = 26 MHz // RF output power = 0 dBm // RX filterbandwidth = 551.067708 kHz // Phase = 1 // Datarate = 250.240707 kbps // Modulation = (7) MSK // Manchester enable = (0) Manchester disabled // RF Frequency = 2432.999988 MHz // Channel spacing = 199.788952 kHz // Channel number = 0 // Optimization = Sensitivity // Sync mode = (3) 30/32 sync word bits detected // Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX // CRC operation = (1) CRC calculation in TX and CRC check in RX enabled // Forward Error Correction = (0) FEC disabled // Length configuration = (1) Variable length packets, packet length configured by the first received byte after sync word. // Packetlength = 255 // Preamble count = (2) 4 bytes // Append status = 1 // Address check = (0) No address check // FIFO autoflush = 1 // Device address = 0 // GDO0 signal selection = ( 6) Asserts when sync word has been sent / received, and de-asserts at the end of the packet // GDO2 signal selection = (11) Serial Clock void writeRFSettings(void) { // Write register settings
TI_CC_SPIWriteReg(TI_CCxxx0_FSCTRL1,0x0c); TI_CC_SPIWriteReg(TI_CCxxx0_FSCTRL0,0x00); TI_CC_SPIWriteReg(TI_CCxxx0_FREQ2,0x5B); TI_CC_SPIWriteReg(TI_CCxxx0_FREQ1,0xFB); TI_CC_SPIWriteReg(TI_CCxxx0_FREQ0,0x04);//04 rx 7c jeep TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG4,0x2d); TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG3,0x36); TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG2,0x73); TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG1,0xc2); TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG0,0xEF); TI_CC_SPIWriteReg(TI_CCxxx0_CHANNR,0x00); TI_CC_SPIWriteReg(TI_CCxxx0_DEVIATN,0x01); TI_CC_SPIWriteReg(TI_CCxxx0_FREND1,0x56); TI_CC_SPIWriteReg(TI_CCxxx0_FREND0,0x10); TI_CC_SPIWriteReg(TI_CCxxx0_MCSM2,0x07); TI_CC_SPIWriteReg(TI_CCxxx0_MCSM1,0x3c);//30 TI_CC_SPIWriteReg(TI_CCxxx0_MCSM0,0x18); TI_CC_SPIWriteReg(TI_CCxxx0_FOCCFG,0x15); TI_CC_SPIWriteReg(TI_CCxxx0_BSCFG,0x6C); TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL2,0xc3); TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL1,0x00); TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL0,0x91); TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL3,0xea); TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL2,0x0A); TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL1,0x00); TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL0,0x11); TI_CC_SPIWriteReg(TI_CCxxx0_FSTEST,0x59); TI_CC_SPIWriteReg(TI_CCxxx0_TEST2,0x8f); TI_CC_SPIWriteReg(TI_CCxxx0_TEST1,0x21); TI_CC_SPIWriteReg(TI_CCxxx0_TEST0,0x0B); TI_CC_SPIWriteReg(TI_CCxxx0_IOCFG2,0x0F); TI_CC_SPIWriteReg(TI_CCxxx0_IOCFG0,0x06); TI_CC_SPIWriteReg(TI_CCxxx0_PKTCTRL1,0x0d);//05 TI_CC_SPIWriteReg(TI_CCxxx0_PKTCTRL0,0x05); TI_CC_SPIWriteReg(TI_CCxxx0_ADDR,0x01); TI_CC_SPIWriteReg(TI_CCxxx0_PKTLEN,0xff); TI_CC_SPIWriteReg(TI_CCxxx0_FIFOTHR,0x07);
} Ваши мнения? Как найти ошибку? еще один момент: к DVDD4 и DCOUPLE подключены конденсаторы как на 0.1 мкф так и на 47 пф. Товарищ ksv198 в своем реально работающем проекте один конденсатор убрал, другой заменил на 220 пф. Работало. Я же по ошибке убрал оба, то есть у меня на этих выводах только 0.1 мкф. Разводку прилагаю Ну и еще вопрос вдогонку: у меня ограниченное количество cc2500, зато валяется штук 20 сс1101. Вроде бы они идентичны по пинам. Смогу ли я тупо напаяв его на плату для сс2500 читать и писать регистры? Не хочется портить сс2500, а сс1101 не жалко.
Сообщение отредактировал zheka - Jun 12 2009, 06:30
|
|
|
|
|
 |
Ответов
(15 - 29)
|
Jun 18 2009, 17:43
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
rx3apfЦитата Похоже, "не то" читается. Читаем правильно, бурстовым чтением ? В любом случае, доставать RSSI и LQI из регистров статуса не очень удобно, гораздо проще включить APPEND_STATUS и получать эти байты вместе с принятым пакетом... А у меня специальная функция (не я автор) чтения статусных регнистров. О различиях судите сами: Код void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count) { char i; cs=0; while (miso); TI_CC_SPI_bitbang_out(addr | TI_CCxxx0_READ_BURST); // Send address for (i = 0; i < count; i++){ buffer[i] = TI_CC_SPI_bitbang_in();// Read data } cs=1; // /CS disable }
char TI_CC_SPIReadStatus(char addr) { char x;
cs=0; while (miso); // Wait CCxxxx ready // /CS enable TI_CC_SPI_bitbang_out(addr | TI_CCxxx0_READ_BURST); // Send address x = TI_CC_SPI_bitbang_in(); // Read data cs=1; // /CS disable return x; } УДАЛОСЬ ОСУЩЕСТВИТЬ СЕАНС СВЯЗИ!!!Выставил мощность по максимуму, дальность не очень - за одной жб стеной уже нет связи. Пока удалось просто включить передатчик на передачу одного байта. ПРиемник поймал GDO0. LQI теперь всегда 0, RSSI - 190-210 (в десятичном формате) , но вот только дальность на значение мало влияет. Да... а вот RXBYTES у меня 0... буду разбираться с настройками. Автор в регистр PKTLEN записал 0xFF Это как, ведь размер буфера всего 64 байт?
Сообщение отредактировал zheka - Jun 18 2009, 17:45
|
|
|
|
|
Jun 19 2009, 15:54
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Господа, не опустошается буфер FIFO при передаче. ПРиемник постоянно обнаруживает несущую, контролирую через пин GDO2, пин GDO0 настроенный как "Asserts when sync word has been sent / received, and de-asserts at the end of the packet. In RX, the pin will de-assert when the optional address check fails or the RX FIFO overflows. In TX the pin will de-assert if the TX FIFO underflows." тоже моргает как надо. То есть при передаче что-то хватает из воздуха, однако RXBYTES все время равно нулю. Вот код, когда я пошагово контроллирую с выводом на экран: Код if (MODE==TRANSMITTER) // ДЛЯ ПЕРЕДАЮЩЕГО МОДУЛЯ {
while (1) { for (i=0;i<64;i++) { RF_TX_Buffer[i]=0x3E;} //Загоняем данные в переменную str=TI_CC_SPIReadStatus(TI_CCxxx0_TXBYTES); // Выводим на экран количество байт в FIFO lcd_setxy(10,60); lcd_str_fl("FIFO BEFORE WRITE ",f8x14, textcolor); lcd_str_ram(str,f8x14, textcolor); TI_CC_SPIWriteBurstReg(TI_CCxxx0_TXFIFO, RF_TX_Buffer, 64); // Заполняем FIFO
str=TI_CC_SPIReadStatus(TI_CCxxx0_TXBYTES); // Выводим на экран количество байт в FIFO lcd_setxy(10,45); lcd_str_fl("FIFO BEFORE TX ",f8x14, textcolor); lcd_str_ram(str,f8x14, textcolor);
TI_CC_SPIStrobe(TI_CCxxx0_STX); // Включаем передачу
while (gdo0==1) { }
str=TI_CC_SPIReadStatus(TI_CCxxx0_TXBYTES); // Выводим на экран количество байт в FIFO lcd_setxy(10,30); lcd_str_fl("FIFO AFTER TX ",f8x14, textcolor); lcd_str_ram(str,f8x14, textcolor);
TI_CC_SPIStrobe(TI_CCxxx0_SFTX); // опустошаем FIFO
str=TI_CC_SPIReadStatus(TI_CCxxx0_TXBYTES); // Выводим на экран количество байт в FIFO lcd_setxy(10,15); lcd_str_fl("FIFO AFTER FLUSH ",f8x14, textcolor); lcd_str_ram(str,f8x14, textcolor);
} } Результаты: BEFORE WRITE 0 BEFORE TX 64 AFTER TX 64 AFTER FLUSH 0 Ргеистры у меня такие: Код TI_CC_SPIWriteReg(TI_CCxxx0_FSCTRL1,0x0c); TI_CC_SPIWriteReg(TI_CCxxx0_FSCTRL0,0x00); TI_CC_SPIWriteReg(TI_CCxxx0_FREQ2,0x5B); TI_CC_SPIWriteReg(TI_CCxxx0_FREQ1,0xFB); TI_CC_SPIWriteReg(TI_CCxxx0_FREQ0,0x04);//04 rx 7c jeep TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG4,0x2d); TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG3,0x36); TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG2,0x73); TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG1,0xc2); TI_CC_SPIWriteReg(TI_CCxxx0_MDMCFG0,0xEF); TI_CC_SPIWriteReg(TI_CCxxx0_CHANNR,0x00); TI_CC_SPIWriteReg(TI_CCxxx0_DEVIATN,0x01); TI_CC_SPIWriteReg(TI_CCxxx0_FREND1,0x56); TI_CC_SPIWriteReg(TI_CCxxx0_FREND0,0x10); TI_CC_SPIWriteReg(TI_CCxxx0_MCSM2,0x07); TI_CC_SPIWriteReg(TI_CCxxx0_MCSM1,0x3c);//30 TI_CC_SPIWriteReg(TI_CCxxx0_MCSM0,0x18); TI_CC_SPIWriteReg(TI_CCxxx0_FOCCFG,0x15); TI_CC_SPIWriteReg(TI_CCxxx0_BSCFG,0x6C); TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL2,0xc3); TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL1,0x00); TI_CC_SPIWriteReg(TI_CCxxx0_AGCCTRL0,0x91); TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL3,0xea); TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL2,0x0A); TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL1,0x00); TI_CC_SPIWriteReg(TI_CCxxx0_FSCAL0,0x11); TI_CC_SPIWriteReg(TI_CCxxx0_FSTEST,0x59); TI_CC_SPIWriteReg(TI_CCxxx0_TEST2,0x8f); TI_CC_SPIWriteReg(TI_CCxxx0_TEST1,0x21); TI_CC_SPIWriteReg(TI_CCxxx0_TEST0,0x0B); TI_CC_SPIWriteReg(TI_CCxxx0_IOCFG2,0x0E); TI_CC_SPIWriteReg(TI_CCxxx0_IOCFG0,0x06); TI_CC_SPIWriteReg(TI_CCxxx0_PKTCTRL1,0x0d);//05 TI_CC_SPIWriteReg(TI_CCxxx0_PKTCTRL0,0x05); TI_CC_SPIWriteReg(TI_CCxxx0_ADDR,0x01); TI_CC_SPIWriteReg(TI_CCxxx0_PKTLEN,0xff); TI_CC_SPIWriteReg(TI_CCxxx0_FIFOTHR,0x07); Что делать и кто виноват?
|
|
|
|
|
Jun 20 2009, 02:57
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Тихо сам с собою я веду беседу... ДОбавил задержку в 2 мс после строба включения передачи. ВРоде бы буфер опустошается. Но почему то до единицы. Ноль только после специального строба. Но все равно на приемнике ничего не читается. хотя GDO0 сначала включается, а потом выключается. О чем это говорит? Могу ли я быть уверенным, что подстройки частоты не требуется? Плюс непонятки с RSSI он у меня всегда в районе 210, изменяясь в пределах 10, независимо от того, включен передатчик или нет. Вот полный код: Код #include <mega32.h> #include <delay.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <stdio.h> #include <disp.h> #include <spi.h>
void putchar(char c); unsigned int Clc_tim0=0; unsigned int Clc_tim0_timout=0; bit Clc_tim0_timout_b=0; unsigned char RF_RX_Buffer[64]; unsigned char RF_TX_Buffer[64];
unsigned char LQI,RSSI; bit RF_TX_b=0;//1-ïåðåäà÷à bit RF_RX_b=0;//1-ïðèåì bit RF_TX_END_b=0;//1-ïåðåäà÷à èñïîëüçóåòñÿ äëÿ îïðåäåëåíèÿ êîíöà îïåðàöèè bit RF_RX_END_b=0;//1-ïðèåì èñïîëüçóåòñÿ äëÿ îïðåäåëåíèÿ êîíöà îïåðàöèè bit RXD_timer=0;// óñòàíàâëèâàåòñÿ êîãäà íóæíî çàáèðàòü äàííûå èç áóôåðà ÷òåíèÿ ïîðòà 10ms
#define SPIF 7 #define SPI2X 1
#define SPR0 0 #define SPR1 1 #define SPHA 2 #define SPOL 3 #define MSTR 4 #define DORD 5 #define SPE 6 #define SPIE 7
#define TRANSMITTER 1 #define RECIEVER 0
#include "TI_CC_spi.h" #include "TI_CC_spi.c" char str, sTEMP, sRSSI, sLQI, sRXBYTES; u08 variable; ui16 textcolor; // color of text ui16 backcolor; // color of background
ui16 varvar;
void lcd_print_regs() { sTEMP=TI_CC_SPIReadStatus(TI_CCxxx0_RSSI);
if (sTEMP!=sRSSI) {
lcd_setxy(10,75); lcd_str_fl("RSSI ",f8x14, textcolor); lcd_str_ram(sRSSI,f8x14, textcolor); sRSSI=sTEMP; }
sTEMP=TI_CC_SPIReadStatus(TI_CCxxx0_LQI); if (sTEMP!=sLQI) { lcd_setxy(10,90); lcd_str_fl("LQI ",f8x14, textcolor); lcd_str_ram(sTEMP,f8x14, textcolor); sLQI=sTEMP; }
sTEMP=TI_CC_SPIReadStatus(TI_CCxxx0_RXBYTES); if (sTEMP!=sRXBYTES) { lcd_setxy(10,60); lcd_str_fl("RXBYTES ",f8x14, textcolor); lcd_str_ram(sTEMP,f8x14, textcolor); sRXBYTES=sTEMP; } }
void main(void) { int MODE; int x=10; int result, i; long int count=0; backcolor=0xBDF7; textcolor=blue;
DDRA.0=1; DDRA.1=1; PORTA.0=1; PORTA.1=1;
PORTB.6=0; DDRB.2=1; DDRD.3=0;
lcd_init(); lcd_clr(); fill_screen(0xbdf7); lcd_setxy(10,120); lcd_str_fl("StartUp CC2500...",f8x14, textcolor);
TI_CC_SPISetup(); // Initialize SPI port TI_CC_PowerupResetCCxxxx(); // Reset CCxxxx
str=TI_CC_SPIReadReg(TI_CCxxx0_IOCFG0 );
lcd_setxy(10,105); lcd_str_fl("GDO0 ",f8x14, textcolor); lcd_str_ram(str,f8x14, textcolor);
writeRFSettings(); // Write RF settings to config reg TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE,paTable,paTableLen );//Write PATABLE TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); TI_CC_SPIStrobe(TI_CCxxx0_SFRX); TI_CC_SPIStrobe(TI_CCxxx0_SFTX);
MODE=TRANSMITTER;
if (MODE==RECIEVER) // ÄËß ÏÐÈÅÌÍÎÃÎ ÌÎÄÓËß {
TI_CC_SPIStrobe(TI_CCxxx0_SRX); while (gdo0==0) { }
while (gdo0==1) { }
while(1) lcd_print_regs(); }
// -----------------------------------------------------------
if (MODE==TRANSMITTER) // ÄËß ÏÅÐÅÄÀÞÙÅÃÎ ÌÎÄÓËß {
while (1) { for (i=0;i<64;i++) { RF_TX_Buffer[i]=0x3E;} //Çàãîíÿåì äàííûå â ïåðåìåííóþ áóôåðà str=TI_CC_SPIReadStatus(TI_CCxxx0_TXBYTES); // Âûâîäèì íà ýêðàí êîëè÷åñòâî áàéò â FIFO lcd_setxy(10,60); lcd_str_fl("BEFORE WRITE ",f8x14, textcolor); lcd_str_ram(str,f8x14, textcolor); TI_CC_SPIWriteBurstReg(TI_CCxxx0_TXFIFO, RF_TX_Buffer, 64); // Çàïîëíÿåì FIFO
str=TI_CC_SPIReadStatus(TI_CCxxx0_TXBYTES); // Âûâîäèì íà ýêðàí êîëè÷åñòâî áàéò â FIFO lcd_setxy(10,45); lcd_str_fl("BEFORE TX ",f8x14, textcolor); lcd_str_ram(str,f8x14, textcolor);
TI_CC_SPIStrobe(TI_CCxxx0_STX); // Âêëþ÷àåì ïåðåäà÷ó delay_ms(2);
while (gdo0==0) { }
while (gdo0==1) { }
str=TI_CC_SPIReadStatus(TI_CCxxx0_TXBYTES); // Âûâîäèì íà ýêðàí êîëè÷åñòâî áàéò â FIFO lcd_setxy(10,30); lcd_str_fl("AFTER TX ",f8x14, textcolor); lcd_str_ram(str,f8x14, textcolor);
TI_CC_SPIStrobe(TI_CCxxx0_SIDLE); TI_CC_SPIStrobe(TI_CCxxx0_SFTX); // îïóñòîøàåì FIFO
str=TI_CC_SPIReadStatus(TI_CCxxx0_TXBYTES); lcd_setxy(10,15); lcd_str_fl("AFTER FLUSH ",f8x14, textcolor); lcd_str_ram(str,f8x14, textcolor);
} }
}
|
|
|
|
|
Jun 20 2009, 08:10
|
Участник

Группа: Новичок
Сообщений: 15
Регистрация: 30-05-05
Пользователь №: 5 537

|
Цитата(zheka @ Jun 20 2009, 05:57)  Тихо сам с собою я веду беседу...
}[/code] Спасибо, порадовали. Напомнили анекдот про девушку и парня в лифте, короче в конце она ему посоветовала делать Это "тихо сам с собою..".
|
|
|
|
|
Jun 20 2009, 14:51
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Цитата Может быть Вам для начала прочитать внимательно datasheet на приемопередатчик. Или если лень, то почему бы не взять готовые экзамплы где уже сделана и работает передача и прием. А в чем проблема то? Я взял готовый проект. Функции чтения и записи регистров у меня оттуда. Отличие в том, что в нем контроллер mega88 и используется USART. А у меня mega32 и LCD индикатор. ДОбуквенно повторить не удастся в любом случае, как считаете? В последнее время неоднократно убеждался, что если отылают читать даташит, значит сам не знают ответа на вопрос. Я думаю, что моя проблема решаема беглым взглядом и небольшим советом опытного человека, чем чтением китайской грамоты на 100 страницах, наверное для того и создан форум, не так ли? КРоме того, в соседней теме неоднократно говорилось о том что документация на чип оставляет желать лучшего.
|
|
|
|
|
Jun 21 2009, 22:52
|

Практикующий маг
     
Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576

|
Цитата(zheka @ Jun 20 2009, 18:51)  А в чем проблема то? Я взял готовый проект. Функции чтения и записи регистров у меня оттуда. Отличие в том, что в нем контроллер mega88 и используется USART. А у меня mega32 и LCD индикатор. ДОбуквенно повторить не удастся в любом случае, как считаете?
В последнее время неоднократно убеждался, что если отылают читать даташит, значит сам не знают ответа на вопрос. Я думаю, что моя проблема решаема беглым взглядом и небольшим советом опытного человека, чем чтением китайской грамоты на 100 страницах, наверное для того и создан форум, не так ли?
КРоме того, в соседней теме неоднократно говорилось о том что документация на чип оставляет желать лучшего. 1. Добуквенно может и не получится, но покрайней мере в моем случае (я работал с двумя приемопередатчиками вплотную и еще с двумя менее плотно) запуск и работа приемопередатчика по примерам проходила без проблем, если инициализация самого контроллера была сделана корректно. 2. Ваш СС2500 я не знаю (различия в этом приемопередатчике и тех что мне довелось использовать весьма велико), а логика работы с тем или иным чипом очень разница, поэтому "беглый взгляд" на Вашу программу мне ничего не говорит. Опытный человек не всегда есть под рукой, и вообще может я не прав, но я привык читать "китайскую грамоту" если чтото не работает, а не заниматься шаманством с вставлянием задержек "авось заработает?" в разные места программы.  Но это чисто ИМХО как говорится, больше не навязываюсь, удачи...
|
|
|
|
|
Jun 29 2009, 10:10
|
Участник

Группа: Участник
Сообщений: 38
Регистрация: 17-04-06
Пользователь №: 16 200

|
Цитата(zheka @ Jun 28 2009, 21:51)  Я так и не понял, почему длина пакета может быть больше длины буфера? Как с буфером в 64 байта передаются пакеты длиной в 200 с чем-то байт? Пакет же не мгновенно передаётся по каналу связи. По мере передачи и опустошения буфера подкачивай данные да и всё. А примет столько, сколько указал байтов.
|
|
|
|
|
Jun 30 2009, 03:28
|
Участник

Группа: Участник
Сообщений: 38
Регистрация: 17-04-06
Пользователь №: 16 200

|
Цитата(zheka @ Jun 29 2009, 17:07)  Насколько я понял, длина пакета - это вещь аппаратная. Так я после сказанного Вами что-то не вижу этой аппаратности. Если я должен вручную подкачивать в буфер, следить за этим, в чем тогда фишка? Я с тем же успехом могу и 1000 байт передать по 64 штуки. Ладно, установил я длину 256 байт, откуда мне их читать на стороне приема? ОГбычно данные берутся из буфера, который равен 64 байтам. Аппаратно формируется заголовок и рассчитывается CRC - в этом и фишка. А читать так же как и передавать. Да, есть механизм формирования пакета и произвольной длины, но лично я, не сторонник передачи длинных пакетов. Короткие пакеты легче без ошибки передать, а при ошибке передать пакет повторно. Много данных всегда передаю разбивая их на пакеты небольшой длины и контролирую целостность последовательности их передачи/приёма.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|