NRF51822 SPI
- KT315B
- Сверлит текстолит когтями
- Сообщения: 1269
- Зарегистрирован: Пт июл 21, 2006 15:05:19
- Откуда: плод воображения
- Контактная информация:
NRF51822 SPI
Доброго времени! Возникло недопонимание в плане работы SPI в контроллере NRF51822. А именно: в Reference Manual (http://infocenter.nordicsemi.com/pdf/nRF51_RM_v3.0.pdf) написано, что отправка наступает после записи в регистр TXD. Т.е. это можно понимать так: после записи в регистр TXD начинается тактирование SPI, генерируется 8 тактовых импульсов и записанный байт сдвигается в MOSI. Ок, допустим. Мне нужно работать с АЦП ADS1220 (http://www.ti.com/lit/ds/symlink/ads1220.pdf) одиночными запросами. Для этого там есть команда START/SYNC (8 бит). Т.е. по времнной диаграмме на стр 37 даташита имеем следующее: посылаем START/SYNC и, спустя время, генерим 3*8=24 тактовых импульса и забираем свои заветные 24 бита с АЦП. А теперь собственно вопрос: как заставить NRF сгенерировать эти тактовые импульсы? Можно ли писать в регистр TXD просто нули, будет ли SPI на это реагировать и генерировать такт? Каким образом контроллер распознает факт записи в регистр? Может быть, кто сталкивался с подобным?
R2AIV 73!
- Реклама
Re: NRF51822 SPI
KT315B, обычно хоть нули хоть что . В SPI что бы что-то получить надо что нибудь послать.
Новичок что ли?
Не знаю как в NRF51 , в NRF52 SPI прост до безобразия ну и плюс еще EasyDMA, ну и плюс махаем лапкой SS аппаратно...
Новичок что ли?
Не знаю как в NRF51 , в NRF52 SPI прост до безобразия ну и плюс еще EasyDMA, ну и плюс махаем лапкой SS аппаратно...
- KT315B
- Сверлит текстолит когтями
- Сообщения: 1269
- Зарегистрирован: Пт июл 21, 2006 15:05:19
- Откуда: плод воображения
- Контактная информация:
Re: NRF51822 SPI
Не, не новичок, но, относительно новичок в NRF )) Непонятно, как контроллер опознает (и опознает ли?) факт записи в TXD. Если вариант с записью нулей прокатывает - проблема решена. Смутило отсутствие нечто типа "TASKSTART" по сравнению, с остальной периферией NRF51. Сам АЦП для экспериментов получу только в понедельник (
Последний раз редактировалось KT315B Пт ноя 16, 2018 14:02:32, всего редактировалось 1 раз.
R2AIV 73!
Re: NRF51822 SPI
В мануале же:
26.1.3 SPI master transaction sequence
An SPI master transaction is started by writing the first byte, which is to be transmitted by the SPI master, to
the TXD register. Since the transmitter is double buffered, the second byte can be written to the TXD register
immediately after the first one. The SPI master will then send these bytes in the order they are written to the
TXD register.
- KT315B
- Сверлит текстолит когтями
- Сообщения: 1269
- Зарегистрирован: Пт июл 21, 2006 15:05:19
- Откуда: плод воображения
- Контактная информация:
Re: NRF51822 SPI
Это читал. Просто, допустим, я туда буду слать постоянно [START/SYNC]--пауза--[0][0][0]. Когда будут идти друг за другом нули - содержимое регистра не будет меняться, каким образом контроллер поймет, что туда что-то записано и надо генерировать такт? Стробирование данных TXD не понятно 
R2AIV 73!
- Реклама
Re: NRF51822 SPI
Фиксируется сам факт записи а не содержимое. Это же для SPI модуля любого производителя справедливо.
Есть лог.анализатор?
Есть лог.анализатор?
- KT315B
- Сверлит текстолит когтями
- Сообщения: 1269
- Зарегистрирован: Пт июл 21, 2006 15:05:19
- Откуда: плод воображения
- Контактная информация:
Re: NRF51822 SPI
Ок, спасибо не был уверен, решил убедиться. Думал, запись стробироваться должна.
UPD: анализатор есть, но к ногам не подобраться - очень плотный монтаж. Попробую на макете попробовать, хорошая идея )
UPD: анализатор есть, но к ногам не подобраться - очень плотный монтаж. Попробую на макете попробовать, хорошая идея )
R2AIV 73!
Re: NRF51822 SPI
Контроллер вообще не анализирует данные, пока его об этом не попросят специально. Сказано "переслать из ячейки памяти А в регистр Б один байт", он выполняет. SPI-блоку точно так же пофиг. Он получил информацию о том, что поступил новый байт, схватил его и поволок выталкивать в линию. Что это за байт, какая у него судьба, что в нем и т.п. абсолютно никого внутри МК не интересует.
- GARMIN
- Держит паяльник хвостом
- Сообщения: 954
- Зарегистрирован: Вс дек 02, 2012 16:58:33
- Откуда: от туда
- Контактная информация:
Re: NRF51822 SPI
Добрый день. Подниму тему. Чип NRF52833, поднимаю SPI Master.
Прописываю настройки и адреса буферов чтения и записи, количество посылок. Но после записи START task ничего не происходит. В регистрах состояния видно, что SPI пытается стартовать, но ему что-то мешает. Никак не пойму, что.
Код настройки SPI (используется только одна ножка MOSI):
Код запуска проще некуда:
Прописываю настройки и адреса буферов чтения и записи, количество посылок. Но после записи START task ничего не происходит. В регистрах состояния видно, что SPI пытается стартовать, но ему что-то мешает. Никак не пойму, что.
Код настройки SPI (используется только одна ножка MOSI):
Спойлер
Код: Выделить всё
NRF_SPIM0->PSEL.CSN = SPIM_PSEL_CSN_CONNECT_Disconnected << SPIM_PSEL_CSN_CONNECT_Pos;
NRF_SPIM0->PSEL.MISO = SPIM_PSEL_MISO_CONNECT_Disconnected << SPIM_PSEL_MISO_CONNECT_Pos;
NRF_SPIM0->PSEL.SCK = SPIM_PSEL_SCK_CONNECT_Disconnected << SPIM_PSEL_SCK_CONNECT_Pos;
NRF_SPIM0->PSEL.MOSI = 0 << SPIM_PSEL_MOSI_PIN_Pos
| 1 << SPIM_PSEL_MOSI_PORT_Pos
| SPIM_PSEL_MOSI_CONNECT_Connected << SPIM_PSEL_MOSI_CONNECT_Pos;
NRF_SPIM0->PSELDCX = SPIM_PSELDCX_CONNECT_Disconnected << SPIM_PSELDCX_CONNECT_Pos;
NRF_SPIM0->CSNPOL = SPIM_CSNPOL_CSNPOL_LOW << SPIM_CSNPOL_CSNPOL_Pos;
NRF_SPIM0->CONFIG = SPIM_CONFIG_ORDER_MsbFirst << SPIM_CONFIG_ORDER_Pos
| SPIM_CONFIG_CPHA_Leading << SPIM_CONFIG_CPHA_Pos
| SPIM_CONFIG_CPOL_ActiveHigh << SPIM_CONFIG_CPOL_Pos;
NRF_SPIM0->FREQUENCY = SPIM_FREQUENCY_FREQUENCY_M8;
NRF_SPIM0->TXD.PTR = (uint32_t)tx_spi_buffer;
NRF_SPIM0->TXD.MAXCNT = 30;
NRF_SPIM0->TXD.LIST = SPIM_TXD_LIST_LIST_Disabled << SPIM_TXD_LIST_LIST_Pos;
NRF_SPIM0->DCXCNT = 0 << SPIM_DCXCNT_DCXCNT_Pos;
NRF_SPIM0->INTENSET = SPIM_INTENSET_END_Set << SPIM_INTENSET_END_Pos; // interrupt after stop transaction
NRF_SPIM0->RXD.PTR = (uint32_t)rx_spi_buff;
NRF_SPIM0->RXD.MAXCNT = 30;
NRF_SPIM0->RXD.LIST = SPIM_RXD_LIST_LIST_Disabled << SPIM_RXD_LIST_LIST_Pos;
NRF_SPIM0->ORC = 0 << SPIM_ORC_ORC_Pos;
NRF_SPIM0->ENABLE = SPIM_ENABLE_ENABLE_Enabled << SPIM_ENABLE_ENABLE_Pos;
NRF_SPIM0->SHORTS = SPIM_SHORTS_END_START_Disabled << SPIM_SHORTS_END_START_Pos;
Спойлер
Код: Выделить всё
NRF_SPIM0->EVENTS_END = 0x0UL;
NRF_SPIM0->TASKS_START = SPIM_TASKS_START_TASKS_START_Trigger << SPIM_TASKS_START_TASKS_START_Pos;- GARMIN
- Держит паяльник хвостом
- Сообщения: 954
- Зарегистрирован: Вс дек 02, 2012 16:58:33
- Откуда: от туда
- Контактная информация:
Re: NRF51833 SPI
Я попроовал запустить просто SPI, без дма.
Настроил по простому:
Теперь, чтобы запустить SPI, достаточно просто пихнуть данные в регистр.
Действительно, один байт передаётся.
Попробовал передать массив , ориентируясь по флагу EVENTS_READY,:
Получил засаду: один байт передаётся, и процесс зависает в цикле проверки флага. Если дебагом остановлю, потом снова запущу, передаётся ещё один байт.
Смотрел в библиотеке NRF, там куча бесполезного кода, но принцип такой же. Пробовал добавить нопов в цикл - не помогло.
Что не так?
Добавлено after 2 hours 59 minutes 30 seconds:
Re: NRF51822 SPI
Вручную запустил. Обязательно чтение RXD в цикле. Даже с прерываниями работает. Эх, ДМА запустить бы, цены бы не было...
Добавлено after 4 hours 39 minutes 41 second:
Re: NRF51822 SPI
Победил, но осадочек остался.
Без включённого вывода CLK, SPI не запускается. Ну и порядок установки регистров некоторый должен быть.
Настроил по простому:
Код: Выделить всё
// Setup SPI0
NRF_SPI0->PSEL.SCK = 13 << SPI_PSEL_MOSI_PIN_Pos
| 0 << SPI_PSEL_MOSI_PORT_Pos
| SPI_PSEL_MOSI_CONNECT_Connected; // Yes MOSI
NRF_SPI0->PSEL.MISO = SPI_PSEL_MISO_CONNECT_Disconnected; // No MISO
NRF_SPI0->PSEL.MOSI = 0 << SPI_PSEL_MOSI_PIN_Pos
| 1 << SPI_PSEL_MOSI_PORT_Pos
| SPI_PSEL_MOSI_CONNECT_Connected; // Yes MOSI
NRF_SPI0->FREQUENCY = SPI_FREQUENCY_FREQUENCY_M8; // 8 Mbps /
NRF_SPI0->CONFIG = SPI_CONFIG_ORDER_MsbFirst << SPI_CONFIG_ORDER_Pos
| SPI_CONFIG_CPOL_ActiveHigh << SPI_CONFIG_CPOL_Pos
| SPI_CONFIG_CPHA_Leading << SPI_CONFIG_CPHA_Pos; // MSB first
NRF_SPI0->INTENSET = SPI_INTENSET_READY_Disabled << SPI_INTENSET_READY_Pos; // disable IRQ
NRF_SPI0->ENABLE = SPI_ENABLE_ENABLE_Enabled; // enable SPIКод: Выделить всё
NRF_SPI0->TXD = buffer[0];Попробовал передать массив , ориентируясь по флагу EVENTS_READY,:
Код: Выделить всё
NRF_SPI0->EVENTS_READY = 0x0UL;
NRF_SPI0->TXD = buffer[0];
for (int n = 1; n < 30; n++)
{
volatile uint32_t stat = 0;
while (!stat)
{
stat = NRF_SPI0->EVENTS_READY;
}
NRF_SPI0->EVENTS_READY = 0x0UL;
NRF_SPI0->TXD = buffer[n];
}Смотрел в библиотеке NRF, там куча бесполезного кода, но принцип такой же. Пробовал добавить нопов в цикл - не помогло.
Что не так?
Добавлено after 2 hours 59 minutes 30 seconds:
Re: NRF51822 SPI
Вручную запустил. Обязательно чтение RXD в цикле. Даже с прерываниями работает. Эх, ДМА запустить бы, цены бы не было...
Добавлено after 4 hours 39 minutes 41 second:
Re: NRF51822 SPI
Победил, но осадочек остался.
Без включённого вывода CLK, SPI не запускается. Ну и порядок установки регистров некоторый должен быть.


