分类:
2008-11-18 09:46:20
学习写NOR驱动,必须了解两方面的知识:1.burnflash的原理;2.NOR的datasheet
读NOR的驱动,各种型号差不多,用我们的代码提供好的函数就可以。
写NOR的驱动,各种型号有所差别,一般的分为关闭写保护、写使能、擦除、写数据等。
表现不同的地方也就是写使能、擦除、写数据等方式的不同。这些差别在NOR的datasheet中都有说明。所以仔细阅读datasheet是关键。
给新型号的NOR添加驱动程序分两步,NOR的初始化和写NOR的驱动
下面以EN25B16和AT26DF161为例分别说明添加NOR驱动的步骤:
一、在结构体类型NOR_VENDOR_ID 中添加所要写驱动NOR的vendoID,红色字体所示
typedef enum
{
ESMT_F
EON_EN25P32,
EON_EN25B16,
MX_
EON_EN
EON_EN25B32,
SST_25VF016B,
MX_
MX_
WIN_W25X
ATML_AT26DF161,
UNKNOW_VENDOR = 0xFFFF
}NOR_VENDOR_ID;
二、在相应的datasheet中分别查找EN25B16和AT26DF161的manufatureID及 deviceID,添加到数组nor_support_vendo[]。
NOR_VENDOR_CONTEXT nor_support_vendor[] = {
{0x
{0x
{0x
{0xC2, 0x2015, "MX__
{0x
{0x
{0xBF, 0x2541, "SST_25VF016B", SST_25VF016B},
{0xC2, 0x5E16, "MX__
{0xC2, 0x2415, "MX__
{0xEF, 0x3015, "WIN__W25X
{0x
};
三、 查找datasheet,在函数InitNorFlash(void)中添加EN25B16和AT26DF161的bytesPerPage、pagesPerSector、bytesPerSector、sectorsPerBlock及totalBlocks的信息。
但是这里要特别注意,配置这几个值时有时不要照搬datasheet的值,否则会出错误。比如配置AT26DF161的信息时,datasheet上明明写的是Sixteen 128-Kbyte Physical Sectors,然后按照datasheet把totalBlocks配成16,这样的话,bytesPerSector就得为128*1024(因为总大小为
这些信息时,要根据实际情况灵活配置。
四、写驱动
函数FTSPI_Write (void* psrc, MMP_UINT addr, MMP_INT size) 是写驱动的核心,其实要改动的地方就在此函数处。
写NOR的顺序为:写使能,关闭写保护,擦除,写使能,写数据,最后取消写使能。
阅读EN25B16的datasheet,发现EN25B16有Two 4-Kbyte, one 8-Kbyte, one 16-Kbyte,one 32-Kbyte, and thirty one 64-Kbyte sectors 。而擦除指令D8h 表示 EN25B16是按Sector擦除的,既擦除单位分别为4K,8K,16K,32K及64K。所以在设bytesPerSector时,对于不同大小的sector要分别设定。而写NOR是每次写32个字节,所以写数据时不用特别设定。