Использование К1921ВК01Т и 1508ПЛ8Т

32-разрядные микроконтроллеры разработки АО "НИИЭТ"

Модераторы: ea, dav, bkolbov, Alis, pip, _sva_

bkolbov
Сообщения: 248
Зарегистрирован: 14 дек 2015, 11:37
Предприятие: АО НИИЭТ
Откуда: Воронеж

Re: Использование К1921ВК01Т и 1508ПЛ8Т

Сообщение bkolbov »

Используется первая альтернативная функцию для шины в микроконтроллере, и CS0,OE0 подключены к каждой из DDS, а CS1,OE1 к микросхеме RAM. Разделяю адресное пространство по маске (по ADDR18), получаю два подпространства по 512Кб.
Чтобы делить по 512К нужно использовать ADDR19 (установить самый старший бит поля CE_MASK в регистре EXT_MEM_CFG).
Но в 1645РУ6 20 линий адреса, и меняя ADDR19 (который есть в 1645РУ6, но нет в 1921ВК01) битом RAM_BANK (который просто как GPIO) я могу переключать адресные пространства RAM. Таким образом получается, что 1645РУ6 делится битом RAM_BANK на два банка памяти (которые по идее по 1МБ, но доступно из них лишь по 512Кбб из-за того, что ADDR18 не доступен для использования).
В итоге, я могу использовать из RAM всего 1Мб, а 1Мб окажется незадействованным. Так ли всё это? Если да, то есть ли способ обойти данное ограничение?
Судя по тому, что 1645РУ6 имеет 20 линий адреса, а её емкость 2М, то она позволяет осуществлять лишь пословный доступ. А значит нужно подключать адреса со смещением, таким образом организовав 4 банка по 512К (необходимо 2 дополнительных пина GPIO):

Код: Выделить всё

MCU_ADDR0 -> не подключен к RAM
MCU_ADDR1 -> RAM_ADDR0
MCU_ADDR2 -> RAM_ADDR1
MCU_ADDR3 -> RAM_ADDR2
MCU_ADDR4 -> RAM_ADDR3
...
MCU_ADDR18 -> RAM_ADDR17
RAM_BANK0 -> RAM_ADDR18
RAM_BANK1 -> RAM_ADDR19
Таким образом, доступ к банкам можно будет осуществлять следующим образом (псевдокод):

Код: Выделить всё

/** в RAM, в первый сектор на 512Кб, записываем данные data_RAM0 */
    RAM_BANK0 = 0;
    RAM_BANK1 = 0;
    (*(volatile uint16_t *)0x40080000) = data_RAM0;

/** в RAM, в второй сектор на 512Кб, записываем данные data_RAM1 */
    RAM_BANK0 = 1;
    RAM_BANK1 = 0;
    (*(volatile uint16_t *)0x40080000) = data_RAM1;

/** в RAM, в третий сектор на 512Кб, записываем данные data_RAM2 */
    RAM_BANK0 = 0;
    RAM_BANK1 = 1;
    (*(volatile uint16_t *)0x40080000) = data_RAM2;

/** в RAM, в четвертый сектор на 512Кб, записываем данные data_RAM3 */
    RAM_BANK0 = 1;
    RAM_BANK1 = 1;
    (*(volatile uint16_t *)0x40080000) = data_RAM3;
Также, хотел узнать, есть ли разница, какой из наборов CS/OE выбирать для памяти, для которой задействованы биты RAM_Ubn и RAM_Lbn?
Нет разницы.
И есть ли возможность не делить адресное пространство между CS0/OE0 и CS1/OE1 если используется просто микросхема памяти, без двух DDS?
Да, можно не делить - просто оставьте нули в поле CE_MASK регистра EXT_MEM_CFG. Но таким образом вы получите лишь одно адресное пространство размером в 512К (физически доступных линий адреса 19 штук ADDR0-ADDR18).
Ответить

Вернуться в «32-разрядные микроконтроллеры»