日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux 模拟时序,stm32GPIO模拟时序读写nandflash(K9F1G08U0B)问题

發(fā)布時(shí)間:2023/12/1 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 模拟时序,stm32GPIO模拟时序读写nandflash(K9F1G08U0B)问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我使用的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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。