Здравствуйте еще раз.
Вобщем написал я некоторый код (точнее портировал с некоторыми своими нововведениями).
Я пробую прочитать 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;
}
Сообщение отредактировал IgorKossak - Nov 26 2012, 20:01
Причина редактирования: [codebox] для длинного кода!!!