本帖最后由 数码小叶 于 2020-5-28 21:47 编辑
上一篇吐槽贴发完过了很久了【NUCLEO试用】二:NUCLEO-L552ZE-Q 各种槛 (出处: 中国电子网技术论坛),后来慢慢的把坑填完了,只是帖子没发,为了完整性,还是得补上,上一篇就说,原本是要驱动nand flash的,结果卡壳了。经过这次体验,发现STM32的FMC接口真的是很方便,省去了很多配置以及不需要跟底层驱动时序打交道了。
"NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。紧接着,1989年, 东芝公司发表了NAND flash结构,强调降低每比特的成本,更高的性能,并且象磁盘一样可以通过接口轻松升级。"Nand flash内存是flash内存的一种,其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。Nand-flash存储器具有容量较大,改写速度快等优点,适用于大量数据的存储 "
FMC接口,全称“Flexible memory controller”,大多数大于64脚的封装中,基本都配备了这个。这个扩展接口很强,参考手册里介绍的很详细,就不写了
这次只是用到了其中的nand flash。
打开cubeMX,直接选择NUCLEO-L552ZE-Q ,这样可以省去很多配置,串口什么的也可以直接使用了。
其他的设置就不写了,主要是FMC相关的,这里选择8位还是16位,根据自己的需求来,后面调用不同的HAL库操作函数。
里面要配置的参数很多,这些参数从哪来呢,就得看使用的nand flash芯片资料了。我测试的是K9F1G080U0E
吐槽一句,这种接线方式有点不可靠,刚开始一直不稳定,后来用热熔胶固定后就稳定了,主要是条件限制,应该用短线焊接起来的。再来寻找需要填的参数,分别来自STM32L552xx and STM32L562xx advanced Arm®-based 32-bit MCUs Reference manual和K9F1G08U0E datasheet
最后配置如下
从模块资料例程里,复制过来测试代码,读取芯片ID
HAL_NAND_Read_ID(&hnand1, &NAND_ID);
printf("Nand Flash ID = 0x%02X,0x%02X,0x%02X,0x%02X ",NAND_ID.Maker_Id, NAND_ID.Device_Id,NAND_ID.Third_Id, NAND_ID.Fourth_Id );
if ((NAND_ID.Maker_Id == 0xEC) && (NAND_ID.Device_Id == 0xF1)
&& (NAND_ID.Third_Id == 0x80) && (NAND_ID.Fourth_Id == 0x15))
{
printf("Type = K9F1G08U0A\r\n");
}
else if ((NAND_ID.Maker_Id == 0xEC) && (NAND_ID.Device_Id == 0xF1)
&& (NAND_ID.Third_Id == 0x00) && (NAND_ID.Fourth_Id == 0x95))
{
printf("Type = K9F1G08U0B\r\n");
}
else if ((NAND_ID.Maker_Id == 0xAD) && (NAND_ID.Device_Id == 0xF1)
&& (NAND_ID.Third_Id == 0x80) && (NAND_ID.Fourth_Id == 0x1D))
{
printf("Type = HY27UF081G2A\r\n");
}
else
{
printf("Type = Unknow\r\n");
}
第一次没成功,后面ok
但是读出的好像不对啊,不是E么,对比数据手册
没有问题,程序中定义错了
再来测试下读写
HAL_NAND_Write_Page(&hnand1, &WriteReadAddr, TxBuffer, 1);
printf("\r\n\r\nWritten number: \r\n");
for(i = 0; i < 13; i++)
{
printf("0x%02X,",TxBuffer[i]);
HAL_Delay(2);
}
HAL_Delay(100);
HAL_NAND_Read_Page(&hnand1, &WriteReadAddr, RxBuffer, 1);
printf("\r\n\r\nRead number: \r\n");
for(i = 0; i < 13; i++)
{
printf("0x%02X,",RxBuffer[i]);
HAL_Delay(2);
}
串口打印,ok
|