Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-июл-22 13:59

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Внешняя шина EBC
СообщениеДобавлено: 2017-авг-15 11:51 
Не в сети

Зарегистрирован: 2017-июл-24 10:16
Сообщения: 57
Alex1979 писал(а):
В вашем случае я бы написал программу с бесконечным циклом, в котором происходит чтение с какого-нибудь адреса, где должна бы по идее быть память, и стал бы разглядывать все подряд сигналы осциллографом на предмет их соответствия документации.

это я уже делал, я просто не могу понять как фимзически это происходит
а это уже 50% ответа и решения
wait states настроил на 30 МГц а сам проц запустил на 72
все бы ничего, кроме такого странного поведения


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешняя шина EBC
СообщениеДобавлено: 2017-авг-15 13:48 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1280
Откуда: АО "ПКК Миландр"
erik писал(а):
Alex1979 писал(а):
В вашем случае я бы написал программу с бесконечным циклом, в котором происходит чтение с какого-нибудь адреса, где должна бы по идее быть память, и стал бы разглядывать все подряд сигналы осциллографом на предмет их соответствия документации.

это я уже делал, я просто не могу понять как фимзически это происходит
а это уже 50% ответа и решения
wait states настроил на 30 МГц а сам проц запустил на 72
все бы ничего, кроме такого странного поведения


А какими типами данных оперируете при работе ?
Можно полный код с объявлением переменных выложить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешняя шина EBC
СообщениеДобавлено: 2017-авг-15 14:42 
Не в сети

Зарегистрирован: 2017-июл-24 10:16
Сообщения: 57
Код:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "systick.h"
#include "uart.h"
#include "clock.h"
#include "sram.h"
#include "led.h"

void ext_mem_test(void);

#define MANY    0x40

static    uint32_t test[MANY];
static    uint32_t mem[MANY];

void main(void)
{
    set_cpu_clock_to72();      /* 72 МГц долен работать!  */
    systick_init();

//    led_init_all();   
    uart_init();
    printf("Begin test\n");
    sram_ports_init();
    sram_bus_init();
    ext_mem_test();
}


void ext_mem_test(void)
{
    int i;
    unsigned long reg = 0x60200000;
    volatile long addr;
    volatile unsigned long data = 1;
   
    for(i = 0; i < MANY;i++) {
      test[i] = rand();
    }
   
   
       
    for(i = 0; i < MANY; i++) {
          addr = reg + i * 4;
          HWREG(addr) = test[i];
    }

     print_hex((char*) test, MANY * 4);
   // print_hex(reg, MANY);
   
    for(i = 0; i < MANY; i++) {
         addr = reg + i * 4;
         mem[i] = HWREG(addr);
    }
   
    for(i = 0; i < MANY; i++) {
      if(mem[i] != test[i]) {
        printf("%d: mem: %08X test: %08X\n", i, mem[i], test[i]);       
      }
    }
   
}
   


/**
* @brief  Reports the source file ID, the source line number
*         and expression text (if USE_ASSERT_INFO == 2) where
*         the assert_param error has occurred.
* @param  file_id: pointer to the source file name
* @param  line: assert_param error line source number
* @param  expr:
* @retval None
*/
#if (USE_ASSERT_INFO == 1)
void assert_failed(uint32_t file_id, uint32_t line)
{
    /* User can add his own implementation to report the source file ID and line number.
       Ex: printf("Wrong parameters value: file Id %d on line %d\r\n", file_id, line) */

    /* Infinite loop */
    while (1) {
    }
}
#elif (USE_ASSERT_INFO == 2)
void assert_failed(uint32_t file_id, uint32_t line, const uint8_t * expr);
{
    /* User can add his own implementation to report the source file ID, line number and
       expression text.
       Ex: printf("Wrong parameters value (%s): file Id %d on line %d\r\n", expr, file_id, line) */

    /* Infinite loop */
    while (1) {
    }
}
#endif            /* USE_ASSERT_INFO */


Код:
/**
  * Инициализация шин адреса и данных
  */
void sram_ports_init(void)
{
    PORT_InitTypeDef port_init_struct;

    /* Разрешим тактирование всех портов */
    RST_CLK_PCLKcmd(ALL_PORTS_CLK, ENABLE);

   /* И дополнительно портов I  */
    RST_CLK_PCLK2cmd( RST_CLK_PCLK2_PORTI, ENABLE);

// Шина адреса

    /* PORTF пины PF5...PF15 для шины адреса A2...A12 на выход.
     * Альтернативный режим для выводов */
    port_init_struct.PORT_Pin = (PORT_Pin_5 | PORT_Pin_6 | PORT_Pin_7 | PORT_Pin_8 |
             PORT_Pin_9 | PORT_Pin_10 | PORT_Pin_11 | PORT_Pin_12 |
             PORT_Pin_13 | PORT_Pin_14 | PORT_Pin_15);
    port_init_struct.PORT_OE = PORT_OE_OUT;   // Выход
    port_init_struct.PORT_MODE = PORT_MODE_DIGITAL;
    port_init_struct.PORT_FUNC = PORT_FUNC_ALTER;   // альтернативная   
    port_init_struct.PORT_SPEED = PORT_SPEED_FAST;   // поставить на PORT_SPEED_FAST !!!
    PORT_Init(MDR_PORTF, &port_init_struct);

    /* PORTD пин PD3  для А13 переопределенная */
    port_init_struct.PORT_Pin = PORT_Pin_3;
    port_init_struct.PORT_OE = PORT_OE_OUT;   // Выход
    port_init_struct.PORT_MODE = PORT_MODE_DIGITAL;
    port_init_struct.PORT_FUNC = PORT_FUNC_OVERRID;   // переопределенная   
    port_init_struct.PORT_SPEED = PORT_SPEED_FAST;   // поставить на PORT_SPEED_FAST !!!
    PORT_Init(MDR_PORTD, &port_init_struct);


    /* PORTE пины PE0...PE5 адреса A14...A19 */
    port_init_struct.PORT_Pin = (PORT_Pin_0 | PORT_Pin_1 | PORT_Pin_2 | PORT_Pin_3 | PORT_Pin_4 | PORT_Pin_5);
    port_init_struct.PORT_OE = PORT_OE_OUT;
    port_init_struct.PORT_MODE = PORT_MODE_DIGITAL;
    port_init_struct.PORT_FUNC = PORT_FUNC_ALTER;   // альтернативная   
    port_init_struct.PORT_SPEED = PORT_SPEED_FAST;
    PORT_Init(MDR_PORTE, &port_init_struct);

#if 1
    /* PORTI пины  PI4, PI5 на адреса, которые формируются A20...A21   - не работают почему то! */
    port_init_struct.PORT_Pin = (PORT_Pin_4 | PORT_Pin_5);
    port_init_struct.PORT_OE = PORT_OE_OUT;
    port_init_struct.PORT_MODE = PORT_MODE_DIGITAL;
    port_init_struct.PORT_FUNC = PORT_FUNC_OVERRID;   // переопределенная
    port_init_struct.PORT_SPEED = PORT_SPEED_FAST;
    PORT_Init(MDR_PORTI, &port_init_struct);
#endif   

// это в принципе не нужно

    /* PORTE пины PE8...PE15 адреса A22...A29 */
    port_init_struct.PORT_Pin = (PORT_Pin_8 | PORT_Pin_9 | PORT_Pin_10 | PORT_Pin_11 |
                                 PORT_Pin_12 | PORT_Pin_13 | PORT_Pin_14 | PORT_Pin_15);
    port_init_struct.PORT_OE = PORT_OE_OUT;
    port_init_struct.PORT_MODE = PORT_MODE_DIGITAL;
    port_init_struct.PORT_FUNC = PORT_FUNC_ALTER;   // альтернативная   
    port_init_struct.PORT_SPEED = PORT_SPEED_FAST;
    PORT_Init(MDR_PORTE, &port_init_struct);

   
    /* PORTC пины PC13 PC14 адреса A30 A31  */
    port_init_struct.PORT_Pin = PORT_Pin_13 | PORT_Pin_14;
    port_init_struct.PORT_OE = PORT_OE_OUT;
    port_init_struct.PORT_MODE = PORT_MODE_DIGITAL;
    port_init_struct.PORT_FUNC = PORT_FUNC_ALTER;   // альтернативная   
    port_init_struct.PORT_SPEED = PORT_SPEED_FAST;
    PORT_Init(MDR_PORTC, &port_init_struct);


// Данные

    /* PORTA пины 0..15 для шины данных 0...15 - основная */
    port_init_struct.PORT_Pin = ALL_PORT_PINS;
    port_init_struct.PORT_FUNC = PORT_FUNC_MAIN;
    port_init_struct.PORT_MODE = PORT_MODE_DIGITAL;
    port_init_struct.PORT_SPEED = PORT_SPEED_FAST;
    PORT_Init(MDR_PORTA, &port_init_struct);

    /* PORTB пины 0..15 для шины данных 16...15  */
    port_init_struct.PORT_Pin = ALL_PORT_PINS;
    port_init_struct.PORT_FUNC = PORT_FUNC_MAIN;
    port_init_struct.PORT_MODE = PORT_MODE_DIGITAL;
    port_init_struct.PORT_SPEED = PORT_SPEED_FAST;
    PORT_Init(MDR_PORTB, &port_init_struct);


// управление

    /* PORTC пины 9..12 для управления шиной - альтерн ноги ~BE0...~BE3 */
    port_init_struct.PORT_Pin = (PORT_Pin_9 | PORT_Pin_10 | PORT_Pin_11 | PORT_Pin_12);
    port_init_struct.PORT_MODE = PORT_MODE_DIGITAL;
    port_init_struct.PORT_FUNC = PORT_FUNC_ALTER;
    port_init_struct.PORT_SPEED = PORT_SPEED_FAST;
    PORT_Init(MDR_PORTC, &port_init_struct);

    /* PORTC - основн. ноги PC0 и PC1 -  ~WR и ~RD */
    port_init_struct.PORT_Pin = (PORT_Pin_0 | PORT_Pin_1);
    port_init_struct.PORT_MODE = PORT_MODE_DIGITAL;
    port_init_struct.PORT_FUNC = PORT_FUNC_MAIN;
    port_init_struct.PORT_SPEED = PORT_SPEED_FAST;
    PORT_Init(MDR_PORTC, &port_init_struct);
}

/**
* Настройки параметров внешней памяти
*/
void sram_bus_init(void)
{
#if 0
    EBC_InitTypeDef EBC_InitStruct;
    EBC_MemRegionInitTypeDef EBC_MemRegionInitStruct;


    /* Enables the HSE clock for EBC control */
    RST_CLK_PCLKcmd(RST_CLK_PCLK_EBC, ENABLE);

    /* Initializes EBC_InitStruct by default values */
    EBC_StructInit(&EBC_InitStruct);

    /* Specifies external bus mode RAM */
    EBC_InitStruct.EBC_Mode = EBC_MODE_RAM;

    /* Calculates the Wait States number for 8 MHz frequency and time interval = 500 ns */
    EBC_InitStruct.EBC_WaitState = EBC_WAIT_STATE_3HCLK;

    /* Initializes the EBC peripheral registers */
    EBC_Init(&EBC_InitStruct);

   
    /* Inittializes the EBC memory region 0х60000000 */
    EBC_MemRegionStructInit(&EBC_MemRegionInitStruct);

    /* Initializes the EBC memory region  */
    EBC_MemRegionInit(&EBC_MemRegionInitStruct, EBC_MEM_REGION_60000000);

    /* Enables the specified EBC memory region settigs. */
    EBC_MemRegionCMD(EBC_MEM_REGION_60000000, ENABLE);
#endif

//    MDR_EBC->CONTROL = 0xf002;// wait state = 15 +  RAM ON
//    MDR_EBC->MEM_REGION[2] = 0x1b0f;
//    MDR_EBC->MEM_REGION[2] = 0x2411;

    /* wait state = 3 + RAM ON. При 72 МГц.*/ 
    MDR_EBC->CONTROL = 0x3002;
    MDR_EBC->MEM_REGION[2] = 0x1205;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешняя шина EBC
СообщениеДобавлено: 2017-авг-15 18:23 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1280
Откуда: АО "ПКК Миландр"
А HWREG где описан ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешняя шина EBC
СообщениеДобавлено: 2017-авг-15 22:18 
Не в сети

Зарегистрирован: 2017-июл-24 10:16
Сообщения: 57
-=Sergei=- писал(а):
А HWREG где описан ?

*(unsigned long*) addr = data;
как то так


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешняя шина EBC
СообщениеДобавлено: 2017-авг-16 14:57 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1280
Откуда: АО "ПКК Миландр"
erik писал(а):
-=Sergei=- писал(а):
А HWREG где описан ?

*(unsigned long*) addr = data;
как то так


Проверка что записалось в разные адреса делается через окно memory view ? как изменится результат, если это окно настроить на отображение 32-х битных слов ?

Ну и еще как идея - проверьте, что сигнал RD доходит до микросхем памяти, и память выставляет данные на шину. Бывали случаи, когда читался последнее записаное значение, так как оно "оставалось в виде зарядов" на шине, так как память не отвечала.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Внешняя шина EBC
СообщениеДобавлено: 2017-авг-18 10:39 
Не в сети

Зарегистрирован: 2017-июл-24 10:16
Сообщения: 57
-=Sergei=- писал(а):
erik писал(а):
-=Sergei=- писал(а):
А HWREG где описан ?

*(unsigned long*) addr = data;
как то так


Проверка что записалось в разные адреса делается через окно memory view ? как изменится результат, если это окно настроить на отображение 32-х битных слов ?

Ну и еще как идея - проверьте, что сигнал RD доходит до микросхем памяти, и память выставляет данные на шину. Бывали случаи, когда читался последнее записаное значение, так как оно "оставалось в виде зарядов" на шине, так как память не отвечала.


и просто читается из порта и выводится через uart
проверю сигнал RD


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Внешняя шина EBC
СообщениеДобавлено: 2017-сен-26 10:28 
Не в сети

Зарегистрирован: 2015-июн-04 10:45
Сообщения: 3
Откуда: Санкт-Петербург
Здравствуйте. Не могли бы Вы разъяснить назначение бит LOW16 и LOW8 регистра EXT_BUS->EXT_BUS_CONTROL (с ревизии 2)

Допустим в регион 0x6000_0000 монтируется внешняя память из 2-х микросхем в параллельном режиме общей разрядностью данных на шине 2 байта (MK_Addr2 -> Memory_Addr0)
При попытки чтения адреса int(0x6000_0000):
1) Без бита LOW16
Будет считан адрес 0x6000_0000, ВЕ[0-3]-активн
При не выровненном на границу слова адресе будет исключение.
2) С битом LOW16
Как будет происходить чтение и как в таком случае нужно подключать микросхемы памяти?

Второй вопрос.
При отдельной настройке региона в регистре RAM_CyclesX, общая настройка WAIT_STATE в регистре EXT_BUS_CONTROL игнорируеся?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB