STM32F746G-EVAL开发板上外接PC28F128M29EWLA的NorFlash芯片,根据官方的原理图F7管脚(/BYTE)接上拉电阻,BYTE#根据手册定义Byte/word organization select: Switches between x8 and x16 bus modes. When BYTE# isLOW, the device is in x8 mode; when HIGH, the device is in x16 mode.因此根据手册定义,去读NorFlash的ID,采用官方的函数库stm32f7xx_hal_nor.c文件中的HAL_NOR_Read_ID函数,NOR_WRITE(NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_16B, NOR_CMD_ADDRESS_FIRST), NOR_CMD_DATA_FIRST)中的参数修改成NOR_MEMORY_16B,此时读取ID数据是错的,若将参数改为NOR_MEMORY_8B,读出的数据内容是正确的,不清楚其中的原因,请有经验的人解释一下,为什么程序操作和手册说明不一致,谢谢。 |
根据m29ew_32mb_12mb.pfd的29页的介绍
-------------------------------------------------------
| x8 | AAA | | 555 | | AAA | |
(90h) |----------| AA |--| 55 |-----| 90 |
|x16 | 555 | | 2AA | | 555 | |
-------------------------------------------------------
以及硬件原理图PC28F128M29EWLA的BYTE#管脚接高电平可知送到
Flash的地址线系列应该为555、2AA、555,
根据RM0090 September2011 Doc ID 018909 Rev 1 Page1228页的描述:
In case of a 16-bit external memory width, the FSMC will internally use HADDR[25:1] to generate the
address for external memory FSMC_A[24:0].
Whatever the external memory width (16-bit or 8-bit), FSMC_A[0] should be connected to external memory
address A[0].
而在F7的文档中,没有搜索到相关描述。
#define NOR_CMD_ADDRESS_FIRST (uint16_t)0x0555
#define NOR_CMD_ADDRESS_SECOND (uint16_t)0x02AA
#define NOR_CMD_ADDRESS_THIRD (uint16_t)0x0555
从上面表上的对应关系上看符合x16模式。而在实际的函数调用中
NOR_ADDR_SHIFT(deviceaddress, NOR_MEMORY_8B, NOR_CMD_ADDRESS_FIRST)传送的参数是NOR_MEMORY_8B
他的目的是将地址乘以2.使地址输出为序列为AAA、554、AAA.
在此时FLASH接收的地址线接收数据为:555、2AA、555,因为此时在16位模式A0为地址线的最低位。对地址数据向右移动一位。
ST提供的msp stm32f7xx_hal_nor.h 中专门提供了NOR memory data width
#define NOR_MEMORY_8B ((uint8_t)0x0)
#define NOR_MEMORY_16B ((uint8_t)0x1)
参数,我认为是一个误导,不应该提供这个参数,
这样大家也不会导致迷惑。