Как прошить Nordic NRF52 с помощью ST-Link и OpenOCD

Во-первых, понадобится собрать последнюю версию openocd из исходников:

git clone https://github.com/ntfreak/openocd.git
cd openocd
./boorstrap
./configure
make

По умолчанию configure включит поддержку некоторых программаторов, в том числе st-link. Если этого не произошло, значит не хватает каких-то зависимостей.

Далее, пишем скрипт:

#!/bin/sh
OPENOCD=/path/to/openocd
SOFTDEVICE=/path/to/nRF5_SDK_14.2.0_17b948a/components/softdevice/s132/hex/s132_nrf52_5.0.0_softdevice.hex

FW=$1
[ -z "$FW" ] && (echo "No fw given!" ; exit 1)

${OPENOCD}/src/openocd \
    -s ${OPENOCD}/tcl \
    -f interface/stlink.cfg \
    -f target/nrf52.cfg \
    -c init \
    -c "reset init" \
    -c halt \
    -c "nrf5 mass_erase" \
    -c "flash write_image ${SOFTDEVICE}" \
    -c "flash write_image ${FW}" \
    -c reset \
    -c exit

Цель для Makefile для Nordic SDK может выглядеть так:

OPENOCD := /path/to/openocd
SOFTDEVICE := /path/to/nRF5_SDK_14.2.0_17b948a/components/softdevice/s132/hex/s132_nrf52_5.0.0_softdevice.hex

flashst: $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex
    @echo Flashing: $<
    $(OPENOCD)/src/openocd -s $(OPENOCD)/tcl -f interface/stlink.cfg -f target/nrf52.cfg \
            -c init \
            -c "reset init" \
            -c halt \
            -c "nrf5 mass_erase" \
            -c "flash write_image $(SOFTDEVICE)" \
            -c "flash write_image $<" \
            -c reset \
            -c exit

STM8 StdPeriph_Lib: UART1_ITConfig()

Для общего развития ковыряю STM8 + SDCC + StdPeriph_Lib. Дошёл до уарта и обнаружил, что контроллер виснет на инициализации прерываний. Проблема где-то в uart.c:UART1_ITConfig(). Если вместо вызова функции сделать запись в регистр, то инициализация проходит и контроллер начинает работать. Выглядит функция не очень. Особенно меня впечатлила вот такая строка:

itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)UART1_IT & (uint8_t)0x0F));

Дело в том, что библиотека универсальная, а контроллеры могут сильно отличаться. Так что функция настройки прерываний сначала выясняет в каком регистре и с каким смещением находится нужный бит. Посчитать в уме что делает этот код я не смог и просто засунул его в сишник на компе, скомпилировал и запустил. Результат — 32, т.е. 5-й бит (RXNE), что сходится с даташитом. Смещение регистра вычисляется проще:

uartreg = (uint8_t)((uint16_t)UART1_IT >> 0x08);

UART1_IT в данном случае равен 0x255, т.е. в итоге мы должны получить 0x02, что тоже верно, флаг лежит в регистре UART1_CR2. Однако что-то всё равно идет не так. В итоге вместо вызова функции написал:

//UART1_ITConfig(UART1_IT_RXNE, ENABLE);
UART1->CR2 |= (uint8_t)UART1_FLAG_RXNE;

Так работает.

+++ UPD
На форуме ST пишут, что проблема с ассертом.

Космическая Atmega

http://www.microchip.com/wwwproducts/en/ATMEGAS64M1

Microchip’s ATmegaS64M1 AVR® microcontroller (MCU) brings the automotive-leading AVR core with CAN capabilities to the aerospace industry. The ATmegaS64M1 MCU is designed for enhanced radiation, extended temperature and increased reliability in critical aerospace applications.

Ждем спутников на ардуине 🙂

CH376 — file manage control chip

Наткнулся на интересную платку и решил открыть рубрику интересных компонентов. Сегодня у нас аппаратная реализация FAT для работы с флешками и SD-картами.

Внешний вид платы:

Структурная схема:

Поддерживаются 3 интерфейса для взаимодействия с микрокнотроллером: параллельная шина, SPI и UART. Подключить можно USB-накопитель или карту SD/MMC. Выпускается в двух корпусах, отличающихся наличием/отсутствием параллельной шины.

Даташит

Модуль на Али

Двуполярное питание от USB

Нашёл интересную схему получения двуполярного питания с помощью step-up преобразователя.

Быстрое макетирование на китайской платке показало работоспособность идеи. Может, соберусь сделать двуполярный источник для генератора сигналов.

Если хотите получать кэшбэк за покупки в онлайн-магазинах, а заодно поблагодарить меня — зарегистрируйтесь по моей реферальной ссылке на letyshops.ru

Дешевый LCD экран 128×64

Удивительное дело — mp3-плеер с экраном на алиэкспрессе можно купить дешевле, чем отдельный экран. Но только купить недостаточно, нужно разобраться с распиновкой. В этом мне помог сайт AlexShu. На всякий случай сохраню у себя картинку и пример кода с его сайта.

// MOSI – Arduino pin 11
// SCLK – Arduino pin 13
// A0 – Arduino pin 9
// RST – Arduino pin 8
// CS – Arduino pin 10
// LED-/+ to GND and 3.3V with 15 Ohm resistor
#include "U8glib.h"
U8GLIB_MINI12864 u8g(10, 9, 8); // SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9, RESET = 8
void draw(void) {
 u8g.setFont(u8g_font_unifont);
 u8g.drawStr( 0, 22, "Hello World!");
}
void setup(void) {
 u8g.setContrast(190);
}
void loop(void) {
 u8g.firstPage(); 
 do {
 draw();
 } while( u8g.nextPage() );
 delay(50);
}

А вот результат:

Плата для удобной распайки разных шлейфов на алиэкспрессе.

Если хотите получать кэшбэк за покупки в онлайн-магазинах, а заодно поблагодарить меня — зарегистрируйтесь по моей реферальной ссылке на letyshops.ru

NRF24 и ESP8266

После долгих мучений наконец-то заставил NodeMCU (ESP8266) работать с nRF24L01p. В этом деле мне здорово помог логический анализатор. Сначала я снял обмен данными с ардуины, где есть отлаженная библиотека и всё работает с полпинка. Затем привел свой код в аналогичный вид, но без какого-либо результата. При снифе моего обмена оказалось, что модуль SPI в NodeMCU поднимает Chip Select после каждого байта! Естественно, загрузка адресов и полезных данных в nRF24 нифига не работала. Сильно запутало то, что чтение и запись одиночных регистров при этом происходили правильно — в одной транзакции я отправлял адрес регистра, в следующей — успешно получал содержимое. Чудеса! Решилось ручным управлением Chip Select’ом с отдельного GPIO. Ну и вишенкой на торте стали перепутанные провода CE и CSN на одной из тестовых плат.

Теперь наконец можно сделать перекладыватель из nRF в MQTT и перенести батарейные датчики с ESP8266 на STM8L+nRF24. Предварительный расчет показал, что батарейки CR2032 должно хватить на 5 лет при отправке данных каждую минуту. Правда, это без каких либо датчиков.

Датчик пульса, операционный усилитель и DSO138

Потихоньку готовлюсь собирать логгер пульса, чтобы записать его изменения во сне. Взял нагрудный датчик с приемником, подключающимся в аудиоразъём смартфона. Приемник выдает импульсы на каждый удар сердца в линию микрофона. С помощью специального приложения можно увидеть пульс, а с помощью простых утилит — просто сигналы на микрофонном входе. Напряжение очень маленькое, необходимо увеличить его, чтобы микроконтроллер увидел сигнал. Для этого взял подвернувшийся MCP6141 и собрал инвертирующую схему. Подобрал резисторы и получил хороший сигнал. Распознать его будет не сложно, а пока нужно разобраться с записью на SD-карту.

DSO138 и Transistor Tester

На прошлых выходных получил долгожданную посылку из Китая — набор для сборки действующей модели осциллографа и тестер компонентов, который при сборке весьма помог. Три часа пайки и отгоняния кошки от компонентов и осциллограф заработал 🙂

Починил гирлянду

Перестала работать гирлянда на балконе. Помогало сжать коробочку с контроллером в кулаке, но стоило её отпустить — гирлянда гасла. К счастью, блок не был заклеен, а держался на сопливых защёлках. Нагуглил схему, ужаснулся, увидев, что конденсатор по питанию впаян задом наперёд. Заменил конденсатор — никакого эффекта. Короткая вспышка при втыкании гирлянду в розетку говорила, что диоды и тиристоры в норме, не хватает лишь управления. Помимо черной кляксы контроллера только один элемент относился к управлению — мегаомный резистор, подающий на контроллер 50 Гц прямо с фазы. Замена резистора помогла, гирлянда ожила!

Источник схемы и советов

Как подслушать NRF24?

Сижу тут, ковыряю NRF24 и думаю, можно ли как-то послушать эфир? Оказалось, что можно, но т.к. частота 2.4 ГГц нужен либо нормальный SDR за 300 баксов, либо баксов за 20 внизконвертер для ТВ-тюнера. Интересно, но я не готов пока потратиться.
http://blog.cyberexplorer.me/2014/01/sniffing-and-decoding-nrf24l01-and.html

Для истории сохраню ссылки:
Конвертер
Декодер

ESP8266: обновление прошивки

Собрать свою прошивку для esp8266 можно на сайте https://nodemcu-build.com/. Для заливки в контроллер мне удобнее использовать инструмент командной строки — esptool.py.

Команда для записи во флэш выглядит так:

esptool.py -p /dev/ttyUSB0 write_flash --flash_mode dio 0x0 ./firmware.bin

Стоит обратить особое внимание на параметр —flash_mode dio, т. к. многие модули не смогут прошиться в режиме qio, который используется по умолчанию. После неудачной прошивки такой модуль будет жаловаться:

rf_cal[0] !=0x05,is 0x74

Я сначала думал, что дело в испорченном разделе конфигурации, но оказалось, что прошивка неправильно пишется. QIO — это quad IO, а DIO — dual IO. Т.е. в первом случае биты данных передаются по четырём линиям, а во втором — только по двум. Получается, что выдаём мы 4 бита за раз, а флэш, не зная об этом, пишет только два. И вместо прошивки получается мусор :-/

avrdude и ft232h

Попалась мне платка UM232H-B. Решил попробовать её в качестве программатора для AVR. В конфиге avrdude есть целых два варианта: UM232H и C232HM, однако, оба они не работают. Перерыв интернет я нашёл старый список рассылки, а в нём — патч. Содержание патча очень простое:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
diff -rupN orig/avrdude.conf.in new/avrdude.conf.in
--- orig/avrdude.conf.in	2014-04-06 23:49:05.261214500 +1000
+++ new/avrdude.conf.in	2014-05-12 13:39:58.468858700 +1000
@@ -491,10 +491,10 @@ programmer
   usbproduct = "";
   usbsn      = "";
 #ISP-signals
-  sck    = 1;
-  mosi   = 2;
-  miso   = 3;
-  reset  = 4;
+  sck    = 0;
+  mosi   = 1;
+  miso   = 2;
+  reset  = 3;
 ;
 
 # C232HM module from FTDI and Glyn.com.au.
@@ -518,10 +518,10 @@ programmer
   usbproduct = "";
   usbsn      = "";
 #ISP-signals
-  sck    = 1;
-  mosi   = 2;
-  miso   = 3;
-  reset  = 4;
+  sck    = 0;
+  mosi   = 1;
+  miso   = 2;
+  reset  = 3;
 ;

Т.е. кто-то просто накосячил с нумерацией выводов, а кто-то за два года не смог патч применить (avrdude version 6.1). С правильной нумерацией выводов avrdude заработал. Попробую донести патч до разработчиков.
Оказалось, в версии 6.3 нумерация правильная.

Realtek RTL8710: Убийца ESP8266

Процессор ARM Cortex M3 @ 166 MHz, встроенный мегабайт флэша (как у недавно анонсированного ESP8285) и больше периферии. Выглядит многообещающе, но SDK и даташитов пока нет.

http://www.cnx-software.com/2016/07/28/an-alternative-to-esp8266-realtek-rtl8710-arm-cortex-m3-wifi-iot-modules-sell-for-2-and-up/

NodeMCU: не работает adc.read()

Как оказалось, из коробки в NodeMCU ацп настроен на измерение напряжения питания и не может измерять напряжение на ножке TOUT, adc.read(0) возвращает 65535. Для того, чтобы изменить это поведение нужно подправить область конфигурации в флэше. Первыми робкими экспериментами я немного окирпичил тестовую платку и долго пытался вернуть её к жизни 🙂

Конфигурация хранится  в последних 16 килобайтах флэша, так что её точное местоположение зависит от размера флэшки. На моей плате node.flashid() возвращает 1458400, что в шестнадцатеричном виде превращается в 0x1640E0. Из этих цифр трудно сделать далеко идущие выводы, но в итоге оказалось, что флэшка у меня на 4 МБ (32 Мбит). Таким образом область конфигурации начинается с адреса 0x3FC000. Для флэшек 512 КБ (4 Мбит) адрес будет 0x7C000.

Сливаем  8 КБ с помощью esptool.py:

python esptool.py -p COM4 read_flash 0x3FC000 0x2000 init.bin

В любом hex-редакторе находим байт по смещению 107 (десятичное). Скорее всего, он будет равен 0xFF. Заменяем на 0x21 (33, т.е. 3.3 В), сохраняем файл и заливаем обратно:

python esptool.py -p COM4 write_flash 0x3FC000 init.bin

Теперь АЦП измеряет напряжение на входе и радует разнообразными значениями от не нуля до 1024.

LM2596 — номиналы резисторов

Запишу, чтобы не считать каждый раз.
Для 5 Вольт — 1.00 k и 3.01 k 1% (4.93 В)
Для 3.3 Вольт — 1.62 k и 2.74 k 1% (3.31 В)

Формула: Vout = 1.23 * (1 + R2/R1)
R1: FB — GND
R2: FB — L1

Как открыть Gmini MagicBook C6LHD

Чтобы открыть книжку Gmini MagicBook C6LHD нужно выкрутить опломбированный винт под заглушкой слота SD-карты и сдвинуть заднюю стенку вверх, в сторону разъёмов.

Общий вид
Общий вид

Под крышкой можно увидеть большую плату с кнопками, аккумулятором на 1500 mAh и посадочным местом для беспроводного модуля. Моделей книжек с WiFi я у Gmini не нашёл. Задел на будущее или готовый референс? (Оказывается, G-mini — это перемаркированная китайская BoEye.) На большую плату напаяна маленькая, с процессором и прочими компонентами. Рассмотрим их подробнее.

Процессор
Процессор

Процессор Rockchip RK2818 предназначен для мобильников и планшетов. В таком устройстве, как электронная книга, значительная часть его функций (беспроводная связь, аппаратное ускорение видео) не используется. Правее расположены две небольших микросхемы. Одна, судя по часовому кварцу, — часы реального времени, вторую идентифицировать не удалось. Ещё правее, у самого края платы, стоит чип с маркировкой 25q40. Если я не ошибся, это 8 Мбит (1 мегабайт) последовательной флэш-памяти, что странно — прошивка книги занимает несколько сотен мегабайт и располагается в NANDе. Отдельная память может быть нужна разве что для загрузчика.

Оперативка
Оперативка

Чип Nanya nt5tu64m16gg-ac — это один гигабит (128 Мб) оперативной памяти DDR2.

Флэш
Флэш

Флэш-память Micron mt29f32g08cbacawp — 32Gbit MLC NAND (4 гигабайта).

Аудио
Аудио

Аудиочасть представлена ЦАПом Wolfson wm8918 и сдвоенным ОУ Globaltech GS358.

Питание
Питание

Регулирует заряд батареи и напряжения на плате контроллер питания AXP 192.

Разбираем: модем AnyData ADU-500

Сегодня мне в руки попал модем Anydata ADU-500. Посмотрим, что там внутри?

На плате были обнаружены следующие микросхемы:

  • Samsung K511F12ACA-BO75 — Flash
  • AnaDigics AWT6136R — 450 MHz power amplifier
  • Qualcomm RFR6170 — CDMA450 Receiver
  • Qualcomm RFT6170 — CDMA450 Transmitter
  • Qualcomm MSM6800A — CDMA modem chipset
  • Qualcomm PM6650 — Power Management IC

Ремонт блока питания D-Link JTA0302D

На прошлой неделе перестала работать точка доступа D-Link DWL2100AP — светодиоды не горят, сети не видно. Разобрал — внутри всё чисто. Сама точка устроена просто и ломаться там особо нечему.


CPU: Atheros AR2313A
RAM: ESMT M12L128168A-7T
Flash: Spansion S29GL032M90TFIR4
PHY: IC+ IP101A
Transformer: TS6121C
Radio: Atheros, не разглядел какой :)

Проверил напряжение на выходе БП — ноль. Вот и причина. Открыть его оказалось непросто — корпус тупо склеен. Долго и аккуратно резал его канцелярским ножом. Внутри обнаружил вздутый конденсатор C10 и сильно поджаренный стабилитрон ZD1. Порыв инет узнал, что нужно заменить ещё и C6. И хотя он выглядел хорошо, я добавил его в список покупок. Как оказалось позднее — очень не зря. Закупив в Мегаэлектронике конденсаторы и два стабилитрона на 12 и 22 В я вернулся домой. Поджаренный стабилитрон, судя по всему, был жив, но грозился развалиться в пыль. Испытание показало, что обратный пробой начинался в районе 20 В (больше мой «лабораторный» БП не умеет). Поэтому на замену поставил 1N4748A. Так же заменил вздутый конденсатор, а C6 трогать не стал. Пробное включение и… ничего — на выходе всё так же ноль. Снова фен в руки, меняю C6. Включаю — работает! Спасибо интернету за ценную подсказку 🙂 Осталось только склеить половинки корпуса, обмотать для надёжности скотчем и подключить все провода на место.

Ссылки:
http://www.e1.ru/talk/forum/read.php?f=29&i=178015&t=178015
http://blog.amigas.ru/?p=263