|
|
  |
Мои мучения с CC2500 |
|
|
|
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
|
|
|