Запустили rs-485. Пока правда только на передачу.
Работает — и ладно, когда дойдет дело до него разберемся. Впрочем, меня гложут подозрения что виновата не плата, а гипер-терминал на ноуте под вистой — при попытке передать десяток символов виснет до синего экрана.
Начал писать прошивку (базовая версия, без наворотов). Работу, в принципе, можно разделить на три этапа: работа с конфигурацией (записать во флэш, считать, проверить валидность и т.п.), основной модуль (ацп и память) и обмены с внешним миром.
Сегодня был день посвященный конфигу.
Хидер:
/*
* ain16_usercfg.h
*
* Created on: 09.06.2009
* Author: Maxx
*/
#ifndef AIN16_USERCFG_H_
#define AIN16_USERCFG_H_
#include "compiler.h"
/*
* ain16_fifo_mode - режим буфера FIFO по достижении установленной границы
*/
typedef enum ain16_fifo_mode {
// прекращение оцифровки
AIN16_FIFO_STOP = 0,
// заполнение буфера сначала
AIN16_FIFO_REFRESH
} ain16_fifo_mode_t;
/*
* adc_userconfig_t - пользовательская конфигурация ацп
* freq частота оцифровки в микросекундах
* fifo_border граница буфера, в КБ
* fifo_mode режим при достижении границы
* mask маска чтения каналов
*
*/
typedef struct ain16_userconfig {
U16 freq;
U16 fifo_border;
ain16_fifo_mode_t fifo_mode;
U16 mask;
} ain16_userconfig_t;
/*
* ain16_nvram_uconfig_t структура данных для записи конфигурации во flash user page
* configured признаг конфигурации, должен быть 0хАА, если конфиг валиден
* checksum контрольная сумма конфига
* config сам конфиг
*
*/
typedef /*const*/ struct ain16_nvram_uconfig {
U8 configured;
U8 checksum;
ain16_userconfig_t config;
} ain16_nvram_uconfig_t;
/*
* Считать конфигурацию АЦП
* config адрес для записи считанного конфига
* Возвращает 1 в случае успешного считывания, 0 в ином случае
*/
extern int ain16_get_userconfig(ain16_userconfig_t * config);
/*
* Записать конфигурацию АЦП
* config адрес конфига
* Возвращает 1 в случае успешной записи, 0 в ином случае
*/
extern int ain16_set_userconfig(ain16_userconfig_t * config);
/*
* Проверить, сконфигурировано ли АЦП
* Возвращает 1 в случае найденной конфигурации, 0 в ином случае
*/
extern int ain16_check_userconfig(void);
#endif /* AIN16_USERCFG_H_ */
Сами функции еще полны непечатных каментов и недоделок.