Pull to refresh

Проект инфо-панели оповещения об авариях (Часть 3)

Reading time3 min
Views21K
Приветствую всех.
Вот уже третья часть довольно сильно затянувшейся истории (раз, два).
Устройство ещё не завершено, хотя почти все основные блоки в настоящий момент собраны:
— Индикаторы (2);
— Процессорный модуль (в этой части);
— Блок питания (импульсный преобразователь 48V -> 5V до 6А) (в процессе, пауза из-за окончательно сломавщихся щупов к осциллографу (кЕтай));

План действий:
[+] SD-Card-Sector
[+] FAT-FS
[+>] OneWire async
[-] Slave firmware
[part] Ethernet
[-] Протокол обмена между процессорами
[-] Bootloader

Осторожно, фото.


Плата процессоров претерпела изменения:
Скрытый текст
V.1:

Разобрана, перенесена на следующую.
V.2:

В первом варианте не удалось развести PORTA главного контроллера, в варианте 2 было исправлено — выведен на полную гребёнку. Возможно использование как дополнительной переферии, так и в роли DAC (если удастся заставить работать без сбоев воспроизведение звука из UDP пакетов).
Переферия модульная. Предусмотрены на плате:
— Датчик температуры DS18B20 (либо любые другие OneWire устройства);
— Часы DS1307;
— Аппаратная консоль (TTL уровни, 115200,N,1);
— Пьезоизлучатель (пищалка, разъём);
— Статусный модуль (подключаемый);
Вид модуля: Очень хорошо бы сделать к нему мини-окна, чтобы диоды не засвечивали «соседей».
Скрытый текст

Процессор управления экраном обзавёлся дополнительным разъёмом подключения внешних индикаторов (часы, просто часы) без дополнительного питания — они будут забирать его непосредственно от БП.

Код пока не собран до конца. Занимаюсь аппаратной частью (в настоящий момент — индикаторы:
Скрытый текст

Динамическая индикация, драйверы строк и столбцов на транзисторах, скважность 8 для каждой строки. Схемы и модели плат будут позднее.

FAT: Частичный базиз — использование библиотеки от «www.roland-riegel.de» (страница билиотеки). Написать хочется самому, так что файлы, хоть и распространяются по лицензии GPL, используются как пример.
Чудом заработала функция чтения/записи с/наSD-карты/у. Инициализация проходит нормально, карта определяется, но при чтении возвращаются нули. Появился странный костыль при запросе чтения/записи сектора — требуется прибавлять к абсолютному адресу константу. Для обычных карт — получается формула: Вычисленный_Адрес = (Требуемый_Сектор + 249 ) * 512. Для SDHC приходится прибавлять 2048.
Скрытый текст
uint8_t SPI_SD_READ_SECTOR(uint32_t Sector)
{
	uint16_t i;
	uint32_t calc_Addr;
	if (Sector == raw_block_buffered)			// Если начало блока совпадает с буфферезованным сектором
	{
		return R_OK;					// Возвращаем успех. Ничего не нужно делать, ибо данные в буфере.
	};
	SPI_Select_CARD();
	if (!(sd_raw_card_type & (1 << SD_RAW_SPEC_SDHC)))	// Если карта НЕ является SDHC - добавляем 9 бит к адресу.
	{
		// !SDHC
		calc_Addr = ((Sector+249) << 9);		// DaFaq?! But will not work in other case.
	} else {
		// SDHC
		calc_Addr = (Sector+2048);			// And one more DAFAQ!
	};
	i = SPI_SD_SendCMD(CMD_READ_SINGLE_BLOCK, calc_Addr);	// Передаём вычисленный адрес карте
	if(i)
	{
		SPI_UnSelect_CARD();				// Отпускаем карту
		return R_ERR;					// Возвращаем ошибку. =(
	};
	while (SPI_SD_Rd_Byte() != 0xFE);			// Ждём начала блока. Чаще всего до 30-40 итераций.
	for (i=0; i<512; i++)					// Читаем байт и заносим его в буфер (512 байт)
	{
		raw_block[i] = SPI_SD_Rd_Byte();
	};
	SPI_SD_Rd_Byte();					// CRC
	SPI_SD_Rd_Byte();					// CRC (2) // IGNORED T_T
	/* deaddress card */
	SPI_UnSelect_CARD();					// Отпускаем карту (шину)
	SPI_SD_Rd_Byte();					// Тактирование.
	raw_block_buffered = Sector;				// Запоминаем сектор, коотрый считали.
	return R_OK;
};

Протестированные карты:
Transcend MicroSD 1GB /Taiwan/ (I C1210000 924)
Transcend MicroSD 2GB /Taiwan/ (8281AB 2G 01DS1)
Samsung MicroSDHC 8GB Class 2 /Taiwan/ (C FJCB85PZ T15)
Kingston MicroSCHC 16GB Class 10 /Taiwan/ (TM2I121100200)

Замеченная странность поведения карт воспроизводится.

Вопрос читателям: Кто-нибудь с подобным сталкивался в работе AVR* с SD-картами?

С Ethernet модулем возникла сложность — сам модуль работает, но подключать его в сеть с наличием активного PoE питания нельзя. Прямая ссылка на datasheet трансформаторов, используемых в Arduino-совместимых Ethernet модулях — в них все 4 пары средней точкой подтянуты к общей точке внутри схемы резисторами в 75Ом (логично, что это линейные терминаторы). При таком соединении возможны всего два варианта — либо БП уходит в защиту, либо сгорает розетка. Оба неприятны.
Сейчас делаю плату Ethernet (фактически, переделываю приобретённый модуль Arduino-ENC28J60 на новую плату). Модуль получился 71*33мм (для сравнения, модуль от Arduino — 55*35мм).
Скрытый текст
Типовая схема из описания к модулю.

Разведённая плата (трансформатор от какого-то, найденого в офисной корзине, устройства — M-TEK G24102MKG — очень плохо гуглится).

Плата в сборе. Трансформатор оказался битым. Но, т.к. в выброшеном устройстве-доноре использовались только первые пары, он заработал в… таком виде.


Платы делаеюся без металлизации отверстий, перемычками на соседний слой.

Недавно более-менее отлажена асинхронная библиотека для OneWire. Пока не до конца дописана, интерфейсов и прочего нет, читает заранее обозначенное количество байт. Нужно несколько переделать на объекты для упрощения работы с ней.
Tags:
Hubs:
+8
Comments2

Articles

Change theme settings