реклама на сайте
подробности

 
 
> Мои мучения с CC2500
zheka
сообщение Jun 12 2009, 06:37
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
4 страниц V  < 1 2 3 4 >  
Start new topic
Ответов (15 - 29)
Alexashka
сообщение Jun 13 2009, 16:14
Сообщение #16


Практикующий маг
******

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



А частотомера нет?
Вобщем Вы меряете 135? кГц частоту, при этом частота дискретизации осциллографа - 200кГц. В этом случае должны получится биения с частотой 200-135 = 65кГц, что вобщемто выходит по делениям как Вы ниже написали.
Если возможно -увеличте коэф.деления чтобы было хотябы кГц 20-40
Go to the top of the page
 
+Quote Post
zheka
сообщение Jun 13 2009, 16:48
Сообщение #17


Гуру
******

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



192 - максимальный коэффициент деления.
Впрочем, я не вижу причин для того чтобы с GDO шел неправильный сигнал. Номинал кварца подходящий, неисправность? это какая должна быть неисправность в кварце, чтобы ровно в два раза занижать частоту?
ЧТо касается работы чипа - регистр я читал, он соответствует делителю 192, значит чип настроен правиольно. Да и тесты проходит. Ладно, буду дальше ковыряться.
Go to the top of the page
 
+Quote Post
zheka
сообщение Jun 18 2009, 17:43
Сообщение #18


Гуру
******

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
zheka
сообщение Jun 19 2009, 15:54
Сообщение #19


Гуру
******

Группа: Участник
Сообщений: 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);



Что делать и кто виноват?
Go to the top of the page
 
+Quote Post
zheka
сообщение Jun 20 2009, 02:57
Сообщение #20


Гуру
******

Группа: Участник
Сообщений: 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);    

       }  
    
   }



}
Go to the top of the page
 
+Quote Post
woodman
сообщение Jun 20 2009, 08:10
Сообщение #21


Участник
*

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



Цитата(zheka @ Jun 20 2009, 05:57) *
Тихо сам с собою я веду беседу...

}[/code]

Спасибо, порадовали.
Напомнили анекдот про девушку и парня в лифте, короче в конце она ему посоветовала делать Это "тихо сам с собою..".
bb-offtopic.gif
Go to the top of the page
 
+Quote Post
Alexashka
сообщение Jun 20 2009, 09:03
Сообщение #22


Практикующий маг
******

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



Цитата(zheka @ Jun 19 2009, 19:54) *
Что делать и кто виноват?

Может быть Вам для начала прочитать внимательно datasheet на приемопередатчик. Или если лень, то почему бы не взять готовые экзамплы где уже сделана и работает передача и прием. А убедившись что она работает у Вас в железе, -уже менять чтото, но опять же - для этого нужно хорошо представлять логику работы конечно автомата приемопередатчика.
Go to the top of the page
 
+Quote Post
zheka
сообщение Jun 20 2009, 14:51
Сообщение #23


Гуру
******

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



Цитата
Может быть Вам для начала прочитать внимательно datasheet на приемопередатчик. Или если лень, то почему бы не взять готовые экзамплы где уже сделана и работает передача и прием.


А в чем проблема то? Я взял готовый проект. Функции чтения и записи регистров у меня оттуда.
Отличие в том, что в нем контроллер mega88 и используется USART. А у меня mega32 и LCD индикатор. ДОбуквенно повторить не удастся в любом случае, как считаете?

В последнее время неоднократно убеждался, что если отылают читать даташит, значит сам не знают ответа на вопрос. Я думаю, что моя проблема решаема беглым взглядом и небольшим советом опытного человека, чем чтением китайской грамоты на 100 страницах, наверное для того и создан форум, не так ли?

КРоме того, в соседней теме неоднократно говорилось о том что документация на чип оставляет желать лучшего.
Go to the top of the page
 
+Quote Post
zheka
сообщение Jun 21 2009, 12:51
Сообщение #24


Гуру
******

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



ДОбавил после приема синхрослова и далее приема пакета задержку в 2 мс - приемник стал ловить байты по 65 штук. CRC в порядке.

Байты те самые, что присылал. Наконец-то!

Почему RSSI и LQI читаемые через статус отличаются от тех, что пишутся в пакет?

Сообщение отредактировал zheka - Jun 21 2009, 12:55
Go to the top of the page
 
+Quote Post
Alexashka
сообщение Jun 21 2009, 22:52
Сообщение #25


Практикующий маг
******

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



Цитата(zheka @ Jun 20 2009, 18:51) *
А в чем проблема то? Я взял готовый проект. Функции чтения и записи регистров у меня оттуда.
Отличие в том, что в нем контроллер mega88 и используется USART. А у меня mega32 и LCD индикатор. ДОбуквенно повторить не удастся в любом случае, как считаете?

В последнее время неоднократно убеждался, что если отылают читать даташит, значит сам не знают ответа на вопрос. Я думаю, что моя проблема решаема беглым взглядом и небольшим советом опытного человека, чем чтением китайской грамоты на 100 страницах, наверное для того и создан форум, не так ли?

КРоме того, в соседней теме неоднократно говорилось о том что документация на чип оставляет желать лучшего.


1. Добуквенно может и не получится, но покрайней мере в моем случае (я работал с двумя приемопередатчиками вплотную и еще с двумя менее плотно) запуск и работа приемопередатчика по примерам проходила без проблем, если инициализация самого контроллера была сделана корректно.
2. Ваш СС2500 я не знаю (различия в этом приемопередатчике и тех что мне довелось использовать весьма велико), а логика работы с тем или иным чипом очень разница, поэтому "беглый взгляд" на Вашу программу мне ничего не говорит. Опытный человек не всегда есть под рукой, и вообще может я не прав, но я привык читать "китайскую грамоту" если чтото не работает, а не заниматься шаманством с вставлянием задержек "авось заработает?" в разные места программы. smile.gif Но это чисто ИМХО как говорится, больше не навязываюсь, удачи...
Go to the top of the page
 
+Quote Post
zheka
сообщение Jun 22 2009, 02:32
Сообщение #26


Гуру
******

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



Вы вообще мои сообщения читаете?
Я написал, что взял готовый проект, инициализация, общение с регистрами и отправка взяты оттуда ДОБУКВЕННО. И все работает. ПРоблема возникла с приемом. И даже если взять готовую функцию, она начинается с проверки RXBYTES, которая у меня и без этой оригинальной функции не работает. А помогли действительно задержки.
Go to the top of the page
 
+Quote Post
zheka
сообщение Jun 28 2009, 17:51
Сообщение #27


Гуру
******

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



Я так и не понял, почему длина пакета может быть больше длины буфера? Как с буфером в 64 байта передаются пакеты длиной в 200 с чем-то байт?
Go to the top of the page
 
+Quote Post
Sergei_B
сообщение Jun 29 2009, 10:10
Сообщение #28


Участник
*

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



Цитата(zheka @ Jun 28 2009, 21:51) *
Я так и не понял, почему длина пакета может быть больше длины буфера? Как с буфером в 64 байта передаются пакеты длиной в 200 с чем-то байт?

Пакет же не мгновенно передаётся по каналу связи. По мере передачи и опустошения буфера подкачивай данные да и всё. А примет столько, сколько указал байтов.
Go to the top of the page
 
+Quote Post
zheka
сообщение Jun 29 2009, 13:07
Сообщение #29


Гуру
******

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



Насколько я понял, длина пакета - это вещь аппаратная. Так я после сказанного Вами что-то не вижу этой аппаратности. Если я должен вручную подкачивать в буфер, следить за этим, в чем тогда фишка? Я с тем же успехом могу и 1000 байт передать по 64 штуки.
Ладно, установил я длину 256 байт, откуда мне их читать на стороне приема? ОГбычно данные берутся из буфера, который равен 64 байтам.
Go to the top of the page
 
+Quote Post
Sergei_B
сообщение Jun 30 2009, 03:28
Сообщение #30


Участник
*

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



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

Аппаратно формируется заголовок и рассчитывается CRC - в этом и фишка. А читать так же как и передавать. Да, есть механизм формирования пакета и произвольной длины, но лично я, не сторонник передачи длинных пакетов. Короткие пакеты легче без ошибки передать, а при ошибке передать пакет повторно. Много данных всегда передаю разбивая их на пакеты небольшой длины и контролирую целостность последовательности их передачи/приёма.
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 13:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01619 секунд с 7
ELECTRONIX ©2004-2016