Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC1114 и прямое подключение к NAND интерфейсу
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
deplen
Здравствуйте.

Изначально не сталкивался с программированием микроконтроллеров, а тем более с программированием LPC микроконтроллеров. Но возникла задача и необходимость прямого соединения LPC1114 и NAND интерфейса.

Примеры которые встречались не могли быть портированы на 1114. Например из примера к 2200 :
Код
void nandFlashInit(void)
{
    //Configure Bank0 as Nand Flash controller
    PINSEL2 = PINSEL2        
                & ( ~(0x3<<26) )                 
                | ( 1<<25 )                 //enable Addr2 as NAND flash ALE
                                            //enable Addr3 as NAND flash CLE
                | ( 1<<8 )                    //enable WE    
                & ( ~( 0x3<<4 ) )
                | ( 1<<4 );                    //enable CS0, OE, D0...D7, D8...D15
    
    BCFG0 = (( 0<<28 )                        //8bit width of data bus
            | ( 0x0<<11 )                    //1 CCLK cycle write
            | ( 1<<10 )                    
            | ( 0x1<<5 )                    //4 CCLK cycle read
            | ( 0x0 ));                        //1 CCLK cycle idle
            
    //GPIO P019 as CS pin,P018 as Busy Status pin
    PINSEL1 &= ( ~0xf0 );
    IO0DIR = IO0DIR
            | ( 1<<19 )                     //P019 configured as output pin
            & ( ~( 1<<18 ) );                //P018 configured as input pin
}

Не понятно как изменить BCFG и вообще что это , под работоспособность на 1114.
Код
#define nandOpen()                  ( IO0CLR |= ( 1<<19 ) )                        //pin for CS, change here!!!
#define nandClose()                ( IO0SET |= ( 1<<19 ) )

Так же в данной конструкции CS - это GPIO пин, который подсоединяется к CE (Chip Enable) NAND интерфейса?

Есть у кого какие мысли по этому поводу? Заранее спасибо.
HHIMERA
Если не ошибаюсь... торжественное вручение волшебного манускрипта по шайтан-ногодрыгу под STM32 уже произошло...
Так и адаптируйте его под LPC1114... делов то...
SyncLair
Почитайте как работает GPIO в мануале от NXP и ещё у них есть Apllication Note-ы по этому ворпросу
deplen
Здравствуйте еще раз.

Вобщем написал я некоторый код (точнее портировал с некоторыми своими нововведениями).

Я пробую прочитать ID, но мне не понятно что возвращается. Совсем не то что нужно. Возник вопрос, по коду вообще должны проходить сигналы или я написал полную чушь?

Прошу подсказать мои ошибки, по мере возможности поподробней. Хотелось бы разобраться полностью в данном вопросе.

nand.h
CODE
/*
* nand.h
*
* Created on: 12.11.2012
* Author: 777
*/

#ifndef NAND_H_
#define NAND_H_

//Nand команды
#define NAND_CMD_ERASE_1 0x60
#define NAND_CMD_ERASE_2 0xD0
#define NAND_CMD_STATUS 0x70
#define NAND_READ_ID 0x90
#define NAND_RESET 0xFF

// Шина данных
#define DATA_PIN_2_3 (1 << 3)
#define DATA_PIN_2_4 (1 << 4)
#define DATA_PIN_2_5 (1 << 5)
#define DATA_PIN_2_6 (1 << 6)
#define DATA_PIN_2_7 (1 << 7)
#define DATA_PIN_2_8 (1 << 8)
#define DATA_PIN_2_9 (1 << 9)
#define DATA_PIN_2_10 (1 << 10)

// Управляющие пины
#define CLE_PIN (1 << 8)
#define ALE_PIN (1 << 5)
#define CE_PIN (1 << 6)
#define WE_PIN (1 << 10)
#define RE_PIN (1 << 9)
#define READY_BUSY_PIN (1 << 11)

// Высокое напряжение и низкое (земля)
#define NAND_CLE(x) x ? GPIOSetValue(1, 8, 1) : GPIOSetValue(1, 8, 0)
#define NAND_ALE(x) x ? GPIOSetValue(1, 5, 1) : GPIOSetValue(1, 5, 0)
#define NAND_CE(x) x ? GPIOSetValue(0, 6, 1) : GPIOSetValue(0, 6, 0)
#define NAND_WE(x) x ? GPIOSetValue(1, 10, 1) : GPIOSetValue(1, 10, 0)
#define NAND_RE(x) x ? GPIOSetValue(1, 9, 1) : GPIOSetValue(1, 9, 0)

// Функции
void Nand_Init( void );
void Nand_Command_Send( uint8_t command );
void Nand_Address_Send( uint8_t address );
void Nand_Data_Send( uint8_t data );
void Nand_Read_Id( uint8_t *data );
uint8_t Nand_Read_Data( void );
/****************************************/

#endif /* NAND_H_ */


nand.c
CODE
/*
* nand.c
*
* Created on: 12.11.2012
* Author: 777
*/

#include "LPC11xx.h"
#include "nand.h"

// Инициализация
void Nand_Init()
{
GPIOInit();
LPC_GPIO0->DIR |= CE_PIN;
LPC_GPIO1->DIR |= (CLE_PIN | ALE_PIN | WE_PIN | RE_PIN | READY_BUSY_PIN);
LPC_GPIO2->DIR |= (DATA_PIN_2_3 | DATA_PIN_2_4 | DATA_PIN_2_5 | DATA_PIN_2_6 | DATA_PIN_2_7 | DATA_PIN_2_8 | DATA_PIN_2_9 | DATA_PIN_2_10); // шина данных на выход

NAND_CE(1);
NAND_ALE(0);
NAND_CLE(0);
NAND_RE(1);
NAND_WE(1);
NAND_CE(0);

Nand_Command_Send( NAND_RESET );
}

void Nand_Command_Send( uint8_t command )
{
LPC_GPIO2->DATA = command;

NAND_CLE(1);
NAND_ALE(0);
NAND_RE(1);
NAND_WE(0);
NAND_WE(1);
}

void Nand_Address_Send( uint8_t address )
{
LPC_GPIO2->DATA = address;

NAND_CLE(0);
NAND_ALE(1);
NAND_RE(1);
NAND_WE(0);
NAND_WE(1);
}

void Nand_Data_Send( uint8_t data )
{
NAND_CLE(0);
NAND_ALE(0);
NAND_RE(1);
NAND_WE(0);

LPC_GPIO2->DATA = 0;
LPC_GPIO2->DATA = data;

NAND_WE(1);
}

void Nand_Read_Id( uint8_t *data )
{
uint8_t i, TimeoutCounter = 0;

Nand_Command_Send(0x90);

Nand_Address_Send(0x00);

while ( ( TimeoutCounter < 10 ) )
TimeoutCounter++;

LPC_GPIO2->DIR &= ~(DATA_PIN_2_3 | DATA_PIN_2_4 | DATA_PIN_2_5 | DATA_PIN_2_6 | DATA_PIN_2_7 | DATA_PIN_2_8 | DATA_PIN_2_9 | DATA_PIN_2_10); // шина данных на вход

// 5 циклов приема данных
for( i = 0; i < 5; i++ )
{
data[i] = Nand_Read_Data();
}
}

uint8_t Nand_Read_Data( void )
{
uint8_t data;

NAND_CE(0);
NAND_CLE(0);
NAND_ALE(0);
NAND_WE(1);
NAND_RE(0);
NAND_RE(1);

data = LPC_GPIO2->DATA;
return data;
}

main.c
CODE
int main(void) {
uint8_t ID[5];

Nand_Init();
Nand_Read_Id(ID);

uint8_t t = ID[0];
uint8_t t1 = ID[1];
uint8_t t2= ID[2];
uint8_t t3 = ID[3];
uint8_t t4 = ID[4];

return 0;
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.