linux 模拟时序,stm32GPIO模拟时序读写nandflash(K9F1G08U0B)问题
我使用的STM32F103VBT6這款芯片,K9F1G08U0B和 STM32F103VBT6連接接口有如下對(duì)應(yīng)關(guān)系:
ALE——PA1
WE——PA2
WP——PA3
R\B——PC0
RE——PC1
CE——PC2
CLE——PC3
8位IO口對(duì)應(yīng)PE0——PE7
下面4個(gè)函數(shù),對(duì)應(yīng)的是讀取設(shè)備的ID,我在main函數(shù)里調(diào)用函數(shù)Nand_Flash_ReadDeviceID();
則會(huì)從串口打印出DeviceID = ec f1 0 95 40,這個(gè)設(shè)備ID號(hào)是正確的。問(wèn)題在下面。
/***************************
寫(xiě)指令函數(shù)
***************************/
void Nand_FlashCommandLatch(uint8_t CommandTypes)
{
Data_PortOutputMode();
Flash_CE_Low;
Flash_CLE_Low;
Flash_ALE_Low;
Flash_WE_High;
Flash_CLE_High;
Flash_WE_Low;
Data_Output(CommandTypes);
Flash_WE_High;
Flash_CLE_Low;
Flash_ALE_High;
Flash_CE_High;
}
/****************************
設(shè)置地址函數(shù)
****************************/
void Nand_Flash_Write_Address(uint32_t Address)
{
Data_PortOutputMode();
Flash_CE_Low;
Flash_CLE_Low;
Flash_WE_High;
Flash_ALE_Low;
Flash_ALE_High;
Flash_WE_Low;
Data_Output((Address));
Flash_WE_High;
Flash_ALE_Low;
Flash_ALE_High;
Flash_WE_Low;
Data_Output((Address >> 8) & 0x0f);
Flash_WE_High;
Flash_ALE_Low;
Flash_ALE_High;
Flash_WE_Low;
Data_Output((Address >> 12) & 0xFF);
Flash_WE_High;
Flash_ALE_Low;
Flash_ALE_High;
Flash_WE_Low;
Data_Output((Address >> 20) & 0xFF);
Flash_WE_High;
Flash_ALE_Low;
Flash_CE_High;
}
/*******************************
用來(lái)讀設(shè)備的ID
*******************************/
void Nand_FlashReadData(uint8_t *pBuffer,uint32_t rd_Length)
{
uint32_t i = 0;
Data_PortInputMode();
Flash_CE_Low;
while(rd_Length--)
{
Flash_RE_Low;
*(pBuffer + i) = Data_Input;
Flash_RE_High;
i++;
}
Flash_RE_High;
Flash_CE_High;
}
/*讀設(shè)備ID函數(shù)*/
void Nand_Flash_ReadDeviceID(void)
{
uint8_t array[5];
Nand_FlashCommandLatch(0x90);
Nand_Flash_Write_Address(0x00);
Nand_FlashReadData(array,5);
printf("DeviceID = %x %x %x %x %x\r\n",array[0],array[1],array[2],array[3],array[4]);
}
下面的兩個(gè)函數(shù)分別是向一頁(yè)中寫(xiě)數(shù)據(jù)的函數(shù)和從一頁(yè)中讀出數(shù)據(jù),我是對(duì)照K9F1G08U0D數(shù)據(jù)手冊(cè)中Page Program Operation的時(shí)序和Read Operation的時(shí)序?qū)懙?#xff0c; 雖然我用的是K9F1G08U0B,但我覺(jué)得這兩個(gè)應(yīng)該時(shí)序上差別,我在main函數(shù)里面執(zhí)行紅色標(biāo)記的代碼,從串口打印出的數(shù)據(jù)如下:
Nand_FlashPage_Program is Error
Page 0 data:0xff 0x1e 0xf0 0x0 0x7 0x0 0xe0 0x0 0x7 0x18
而我寫(xiě)入的數(shù)據(jù)為 uint8_t arr[]="0123456789";
哪位大俠遇到過(guò)這樣的問(wèn)題,幫小弟解決一下,到底我的寫(xiě)錯(cuò)在哪里還是我的操作順序有問(wèn)題呢?
/****************************
向某一頁(yè)中寫(xiě)數(shù)據(jù)
****************************/
bool Nand_FlashPage_Program(uint32_t PageNumber,uint8_t *string)
{
uint8_t regvalue = 0;
uint32_t i=2048,j=0;
uint32_t Address = PageNumber*2048;
uint8_t *pBuffer=string;
Data_PortOutputMode();
Flash_CE_Low;
Flash_ALE_Low;
Flash_RE_High;
Flash_CLE_High;
Flash_WE_Low;
Data_Output(0x80);
Flash_WE_High;
Flash_CLE_Low;
Flash_ALE_High;
Flash_WE_Low;
Data_Output((Address));
Flash_WE_High;
Flash_WE_Low;
Data_Output((Address >> 8) & 0x0F);
Flash_WE_High;
Flash_WE_Low;
Data_Output((Address >> 12) & 0xFF);
Flash_WE_High;
Flash_WE_Low;
Data_Output((Address >> 20) & 0xFF);
Flash_WE_High;
Flash_ALE_Low;
while(i--)
{
Flash_WE_Low;
Data_Output(*(pBuffer + j));
Flash_WE_High;
j++;
}
Flash_WE_Low;
Flash_CLE_High;
Data_Output(0x10);
Flash_WE_High;
Flash_Wait();
Flash_WE_Low;
Data_Output(0x70);
Flash_WE_High;
Flash_CLE_Low;
Data_PortInputMode();
Flash_RE_Low;
regvalue = Data_Input;
Flash_RE_High;
if(!( (1 << 0) & regvalue))
{
return TRUE;
}
else
{
return FALSE;
}
}
/*********************
從一頁(yè)中讀出數(shù)據(jù)
*********************/
void Nand_Flash_ReadOnePage(uint32_t sc_address,uint8_t *string)
{
uint32_t Address = 2048*sc_address;
uint32_t i=2048,j=0;
uint8_t dat;
Data_PortOutputMode();
//Flash_CLE_Low;
//Flash_CE_High;
//Flash_WE_High;
Flash_CE_Low;
Flash_ALE_Low;
Flash_RE_High;
Flash_CLE_High;
Flash_WE_Low;
Data_Output(0x00);
Flash_WE_Low;
Flash_WE_High;
Flash_CLE_Low;
Flash_ALE_High;
Flash_WE_Low;
Data_Output(Address);
Flash_WE_High;
Flash_WE_Low;
Data_Output((Address >> 8) & 0x0F);
Flash_WE_High;
Flash_WE_Low;
Data_Output((Address >> 12) & 0xFF);
Flash_WE_High;
Flash_WE_Low;
Data_Output((Address >> 20) & 0xFF);
Flash_WE_High;
Flash_ALE_Low;
Flash_CLE_High;
Flash_WE_Low;
Data_Output(0x30);
Flash_WE_High;
Flash_CLE_Low;
Flash_Wait();
Data_PortInputMode();
while(i--)
{
Flash_RE_Low;
*(string+j) = Data_Input;
Flash_Delay(c_FlashDelayCnt);
Flash_RE_High;
Flash_Delay(c_FlashDelayCnt);
}
}
int main(void)
{
uint8_t array[2112],i;
bool Is_ok;
Init_RCC();
delay_init(64); ? ? //延時(shí)函數(shù)初始化
NVIC_Configuration(); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
uart_init(115200);
Nandflash_Init();
Is_ok = Nand_FlashPage_Program(0x00,arr);
if(Is_ok==TRUE)
printf("Nand_FlashPage_Program is Successful\r\n");
else
printf("Nand_FlashPage_Program is Error\r\n");
while(1)
{
Nand_Flash_ReadOnePage(0x00,array);
printf("Page 0 data:");
for(i=0;i<10;i++)
{
printf("0x%x ",array);
}
printf("\r\n");
delay_ms(1000);
}
}
這是我的nandflash初始化函數(shù)
void Nandflash_Init()
{
GPIO_InitTypeDef ?GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIOE->CRL = 0x33333333;
Flash_WP_High;
}
總結(jié)
以上是生活随笔為你收集整理的linux 模拟时序,stm32GPIO模拟时序读写nandflash(K9F1G08U0B)问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 超速罚款多少钱啊?
- 下一篇: linux光标美化包,使用 [ powe