Полная версия этой страницы:
Вопросы по трансиверам Si446x
Ruslan-maniak
Jan 13 2014, 09:27
Доброго дня коллеги. Волею судеб начал работать со своим первым трансивером фирмы Silicon Labs. Модель Si4460. И ничего не получается. Для начала пытаюсь связать его с МК. Запрашиваю данные по SPI но в ответ тишина. На шине просматриваются только запрос в сторону трансивера и тактирование SPI. В ответ же ничего. Пробовал разную скорость. В том числе и максимальную 10 МГц. Опрашивал разные регистры, в том числе и Fast Response Registers и другие настроечные регистры. Но везде тишина. Что я могу делать не так? Подскажите пожалуйста.
На любую команду, трансивер отвечает 0xFF. Однако если я отправляю запрос о готовности принять команду по SPI (0x44), то в ответ получаю 0x00. То есть трансивер не готов получать команду.
Vlad27
Jan 14 2014, 14:30
Используете ли Wireless Development Suite для работы с чипом?
Ruslan-maniak
Jan 15 2014, 02:21
Нет, не использую. Чип просто подключен к МК по SPI. Вчера под вечер я наконец сумел считать данные из регистра PART_INFO (0x01). Чип выдавал пару байт 0x44,0x60. Все остальные регистры равны нулю были. Сегодня пришёл, запустил туже самую программу - чип уже не отвечает. И появился ещё вопрос наперёд: а где взять-то значения регистров для конфигурации? В даташите там как-то туманно всё это описано. Вообще документация странная на мой взгляд.
Vlad27
Jan 15 2014, 13:04
Да как раз из примеров Wireless Development Suite и можно позаимствовать последовательность команд для инициализации трансивера. А также получить содержимое регистров под свой проект. Кроме даташита необходимо ознакомится с Programming Guide и API Description.
Ruslan-maniak
Jan 21 2014, 03:26
А, ну вот, в API Description более-менее определены регистры. Но по сути с места я не сдвинулся. Сейчас всё обстоит следующим образом. При отправке в 0х44 я получаю в ответ один байт 0xFF а затем нули, при любой другой команде я получаю бесконечно 0xFF. И всё, других вариантов нет. Как достучаться до чипа ума не приложу (
Ruslan-maniak
Jan 23 2014, 04:25
Ну что, ни у кого нет ни какаих идей почему так может быть? Как вообще впринципе проверить живой ли чип?
UnDerKetzer
Jan 27 2014, 07:39
Рискну и спрошу:
настройки модуля SPI верные?
SDN (1) пин прижат к земле?
Vlad27
Jan 27 2014, 10:20
Побольше бы информации о подключении, кусок кода, ответственного за инициализацию, обмен по SPI.
Jury093
Jan 27 2014, 10:42
Цитата(Ruslan-maniak @ Jan 23 2014, 08:25)

Ну что, ни у кого нет ни какаих идей почему так может быть? Как вообще впринципе проверить живой ли чип?
дно у чипа хорошо припаяно?
как уже выше писали - SDN на gnd подключен?
питание +3.3 и не шумит? хост с SPI на таком же напряжение?
осциллом диаграммы смотрели? все вовремя тактируется? CLKspi<=10MHz?
чудес не бывает..
косвенно проверить можно измерив потребление микросхемы и заглянув в даташит - если сильно меньше, то кварц не "завелся" или чип спит.. если сильно больше, то ошибка монтажа или чип дохлый..
У меня на 4463 SDN просто на землю недостаточно было, подаю импульс пару мс. Хотя может и не в том дело было.
Ruslan-maniak
Feb 3 2014, 04:22
Извиняюсь что не отвечал. Накосячил я в работе с пином nSel. не отпускал его между отправкой команды и получением ответа. Сейчас всё норм. Но появилась другая проблема. Какие бы данные я не записывал в TX_FIFO, при отправке отправляется пакет с одними и теми же данными. По крайней мере на дублирующем пине TX_DATA, я всегда вижу пакет с одними и теми же данными. При этом преамбула и синхрослово формируются нормально и размер отправляемого пакета изменяется в зависимости от количества отправляемых данных. Но вот сами данные не зависят от того что я записываю в TX_FIFO. Почему так может быть?
В качестве примера: открытый проект с использование Si4464 -
https://github.com/tkrahn/pecanpico4 (http://kt5tk.wordpress.com/2013/07/24/pecan-pico-4-serial-number-1-built-working/)
Ruslan-maniak
Feb 3 2014, 05:22
Вы уверены что он рабочий? В библиотеке для Si446x толком ничего не реализовано. Только поверхностные настройки. А связаного с передачей данных там вовсе ничего нет.
И ещё такой вопрос: Реально ли связать трансиверы разных производителей? Не могут ли возникнуть нестыковки? Кто-нибудь пробовал?
SergNK
Feb 15 2014, 17:55
Цитата(Ruslan-maniak @ Feb 3 2014, 07:22)

Извиняюсь что не отвечал. Накосячил я в работе с пином nSel. не отпускал его между отправкой команды и получением ответа. Сейчас всё норм. Но появилась другая проблема. Какие бы данные я не записывал в TX_FIFO, при отправке отправляется пакет с одними и теми же данными. По крайней мере на дублирующем пине TX_DATA, я всегда вижу пакет с одними и теми же данными. При этом преамбула и синхрослово формируются нормально и размер отправляемого пакета изменяется в зависимости от количества отправляемых данных. Но вот сами данные не зависят от того что я записываю в TX_FIFO. Почему так может быть?
А производится ли действительно запись данных в FIFO?
Советую поставить WDS3 и заглянуть в c:\Program Files (x86)\SiLabs\WDS3\DemoExample\ и найти там много полезного. В т.ч. драйверы и API.
Имею проблему с трансивером si4461. Плата с трансивером из фирменного демокита. За основу был взят проект Si446x_BidirectionalPacket из папки с примерами WDS. Микроконтроллер STM32F0. Проблема в том, что не проходит команда POWER_UP в функции Radio_Init(). При ожидании готовности CTS после отправки команды POWER_UP вылетает в таймаут:
CODE
uint8_t radio_comm_GetResp(uint8_t byteCount, uint8_t* pData)
{
uint8_t ctsVal = 0;
uint16_t errCnt = RADIO_CTS_TIMEOUT;
while (errCnt != 0) //wait until radio IC is ready with the data
{
radio_hal_ClearNsel();
radio_hal_SpiWriteByte(0x44); //read CMD buffer
ctsVal = radio_hal_SpiReadByte();
if (ctsVal == 0xFF)
{
if (byteCount)
{
radio_hal_SpiReadData(byteCount, pData);
}
radio_hal_SetNsel();
break;
}
radio_hal_SetNsel();
errCnt--;
}
if (errCnt == 0)
{
while(1)
{
BSP_LED_Toggle(LED_RED);
/* ERROR!!!! CTS should never take this long. */
}
}
if (ctsVal == 0xFF)
{
ctsWentHigh = 1;
}
return ctsVal;
}
При этом команда PART_INFO выполняется без проблем (см. осциллограммы). Аппаратный сброс трансивера также выполняется. Осциллограммы прилагаю. В чем может быть дело? Буду рад любому дельному совету. Спасибо.
Проблема была связана с SPI STM32F0. С использованием прерывания по SPI и ожидания завершения текущей операции решило проблему:
CODE
void SPI_WriteData(uint8_t* Buff, uint8_t size)
{
if(HAL_SPI_TransmitReceive_IT(&pSpiHandle, (uint8_t*)Buff, (uint8_t*)Buff, size) != HAL_OK)
{
/* Transfer error in transmission process */
Error_Handler();
}
/* Wait for the end of the transfer */
while (HAL_SPI_GetState(&pSpiHandle) == HAL_SPI_STATE_BUSY_TX);
}
void SPI_ReadData(uint8_t* Buff, uint8_t size)
{
if(HAL_SPI_TransmitReceive_IT(&pSpiHandle, (uint8_t*)Buff, (uint8_t*)Buff, size) != HAL_OK)
{
/* Transfer error in transmission process */
Error_Handler();
}
/* Wait for the end of the transfer */
while (HAL_SPI_GetState(&pSpiHandle) == HAL_SPI_STATE_BUSY_RX);
}
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.