[an error occurred while processing this directive]
|
Документация на 2191 действительно как ребус...
Вроде нашёл, что буферизация - это упрощённые дескрипторы...
Сделал с двумя дескрипторами и двумя буферами (один буфер - код запроса к DataFlash, адрес страницы и адрес странице + 4 байта резерва... После чего DMA переключается на приём во второй буфер, описанный другим дескриптором...)
Проблема в том что в симуляторе это всё работает не так как ожидается...
Во первых передаются не 8 а только 4 байта из буфера передачи...
В буфер приёма попадают данные неизвестно с чего и как...
Пожалуйста, помогите???
Мои настройки:
* * *
// Настроить работу SPI0
iopg = SPI0_Controller_Page;
// Настроить регистр конфигурации SPI0
ar = b#0101000000100110;
io(SPICTL0) = ar;
// SCK0 на 80/4 = 20 МГц
ar = 2;
io(SPIBAUD0) = ar;
// Задействовать выходы выборок устройств, подключенных к SPI
ar = SPI0SEL1;
io(SPIFLG0) = ar;
* * *
// Буфер передачи кода команды и адреса для чтения DataFlash
.var CMD_Read[8] =
0xE8,0x01,0x02,0x03,0x04,0x05,0x06,0x07;
// Дескриптор, описывающий послание кода команды для чтения DataFlash
.var CMD_Read_Descriptor[5] =
b#1000000000000001, // Config word
0, // Start page
CMD_Read, // Start address
Length(CMD_Read), // DMA count
Buffer_Read_Descriptor; // Next pointer
// Буфер чтения данных из DataFlash
.var Buffer_Read[200];
// Дескриптор, описывающий чтение данных из DataFlash
.var Buffer_Read_Descriptor[5] =
b#1000000000000111, // Config word
0, // Start page
Buffer_Read, // Start address
Length(Buffer_Read), // DMA count
END_DMA; // Next pointer
* * *
Запуск всего этого:
iopg = SPI0_Controller_Page;
// Указатель на 1 дескриптор, описывающий запись кода
// команды для операции чтения из DataFlash
ar = CMD_Read_Descriptor;
io(SPI0D_CP) = ar; // SPI 0 DMA Next Descriptor Pointer
// Конфигурационный регистр в начале операции записи/чтения
ar = b#0000000000000001;
io(SPI0D_CFG) = ar; // SPI 0 DMA Configuration register
// Сбросить прерывание обмена SPI по DMA
// ar = 0x0001;
// io(SPI0D_IRQ) = ar; // SPI 0 DMA Interrupt register
// Определить готовность цепи дескрипторов передачи SPI через DMA
// ar = 0x0001;
// io(SPI0D_CPR) = ar; // SPI 0 DMA Descriptor Ready
// Размер блока передачи данных по SPI
// ar = Length(CMD_Read);
// io(SPI0D_CNT) = ar; // SPI 0 DMA Count register
E-mail: info@telesys.ru