/*
Copyright (c) 2011,成都智明达数字设备有限公司
All rights reserved.
文件名称:norflash.c
摘要:norflash驱动、扇区擦除、读写数据、读设备ID
适用于S29GL01GS11D芯片
*/
/* 修改历史:
2023.9.7,ranjingshuang,创建文件。
*/
#include "stdio.h"
#include "norflash.h"
#include "delay.h"
#define BASEAddress 0x70000000
#define RESIGER_STATUS(status) ((status) & 0X20)
#define FLASH_LINE_SIZE 512 //512字节,写入数据使用的short
#define FLASH_BUFFER_SIZE 512
#define emif16_write(addr,data) *(unsigned short*)(0x70000000 + 2*addr) = (unsigned short)data
#define emif16_read(addr) (*(unsigned short*)(0x70000000 + 2*addr))
/*global function define*/
/*void flashDelay(UINT32 unDelayCnt)
{
while (unDelayCnt -- > 0 )
{
asm(" NOP 5");
}
}*/
/************************************************************************
* 函数名称:emifFlashReadID
* 函数说明:读取FLASH ID信息
* 输入参数:无
* 输出参数:无
* 返回值:无
* 备注:内部调用
************************************************************************/
unsigned short temp[4];
int emifFlashReadID()
{
/*为什么地址偏移量都要乘以2,因为EMIF16数据宽度是16位的,一次传输数据时是发送两个字节的数据
* 就相当于往地址0写两个数据,会写到0.1,往地址2写数据,会写到2.3,往地址3写数据会写到4.5.所以想要数据
* 一一对应的写到地址,旧的将地址乘以2*/
emif16_write(0x555, 0xAA);
delayus(1);
emif16_write(0X2AA, 0X55);
delayus(1);
emif16_write(0X555, 0X90);
delayus(1);
temp[0] = emif16_read(0x0);
delayus(1);
temp[1] = emif16_read(0x1);
delayus(1);
temp[2] = emif16_read(0XE);
delayus(1);
temp[3] = emif16_read(0XF);
/*退出读ID*/
emif16_write(0, 0XF0);
return 0;
}
/************************************************************************
* 函数名称:flashSectorErase
* 函数说明:通过扇区地址擦除FLASH指定扇区
* 输入参数:sectoraddr:地址偏移
* 输出参数:无
* 返回值:无
* 备注:内部调用
* 其他:flash_status_register:读取状态寄存器位,查看是否擦除成功
************************************************************************/
void flashSectorErase(int sectoraddr)
{
//一个扇区128KByte
int stat = 0;
sectoraddr = sectoraddr/2;
/*1、两个解锁周期*/
emif16_write(0x555, 0xAA);
delayus(1);
emif16_write(0x2AA, 0x55);
delayus(1);
emif16_write(0x555, 0x80);
delayus(1);
emif16_write(0x555, 0xAA);
delayus(1);
emif16_write(0x2AA, 0x55);
delayus(1);
emif16_write(sectoraddr, 0x30);
delayms(500);
/*状态寄存器读取命令*/
do
{
stat= flashStatusRegister();
}while(stat & ESB);
}
/************************************************************************
* 函数名称:flashChipErase
* 函数说明:整
* 输入参数:无
* 输出参数:无
* 返回值:无
* 备注:内部调用
* 其他:无
************************************************************************/
void flashChipErase()
{
emif16_write(0x555, 0xAA);
emif16_write(0x2AA, 0x55);
emif16_write(0x555, 0x80);
emif16_write(0x555, 0xAA);
emif16_write(0x2AA, 0x55);
emif16_write(0x555, 0x10);
}
/************************************************************************
* 函数名称:ppbLock
* 函数说明:整
* 输入参数:无
* 输出参数:无
* 返回值:无
* 备注:内部调用
* 其他:无
************************************************************************/
int ppbLock()
{
int b;
emif16_write(0X555, 0XAA);
emif16_write(0X2AA, 0X55);
emif16_write(0X555, 0XC0);
b = emif16_read(0);
printf("ppb=%x\n", b);
}
/************************************************************************
* 函数名称:dybLock
* 函数说明:读取指定扇区的dyb位查看是否上锁,将读取的状态打印出来
* 输入参数:无
* 输出参数:无
* 返回值:无
* 备注:内部调用
* 其他:无
************************************************************************/
int dybLock()
{
int d;
emif16_write(0X555, 0XAA);
emif16_write(0X2AA, 0X55);
emif16_write(0X555, 0XE0);
d = emif16_read(0);
printf("dyb=%x\n", d);
}
/************************************************************************
* 函数名称:flash_write_data
* 函数说明:从指定的扇区地址,写入两个字节数据
* 输入参数:readaddr:偏移地址
* pdata:写入的数据
* 输出参数:无
* 返回值:return 0;
* 备注:内部调用
* 其他:无
************************************************************************/
int flashWriteData(unsigned int readaddr, unsigned short pdata)
{
emif16_write(0x555, 0XAA);
delayus(250);
emif16_write(0X2AA, 0X55);
delayus(250);
emif16_write(0X555, 0XA0);
delayus(250);
emif16_write(readaddr, pdata);
delayus(250);
return 0;
}
/************************************************************************
* 函数名称:flashWriteBufferData
* 函数说明:向缓冲区写入数据,在指定地址开始写入指定长度的,指定数据长度写入数据
* 输入参数:readaddr:偏移地址
* pdata:写入的数据
* len:单位长度,最大256word,512字节
* 输出参数:无
* 返回值:-1错误,0成功
* 备注:内部调用
* 其他:flash_status_register:读取状态寄存器看是否写入数据成功
************************************************************************/
int flashWriteBufferData(unsigned int writeaddr1, unsigned short *pdata1,unsigned int len)
{
int i;
int status = 0;
if((writeaddr1 % 2) != 0)
{
printf("输入的地址是奇数");
return -1;
}
if(len > FLASH_LINE_SIZE)
{
//len = FLASH_LINE_SIZE;
printf("写入的地址长达超过缓冲区");
return 1;
}
if(pdata1 == NULL)
{
return -1;
}
len = len/2;//254
writeaddr1 = writeaddr1/2;//10001
emif16_write(0X555, 0XAA);
delayus(500);
emif16_write(0X2AA, 0X55);
delayus(500);
emif16_write(writeaddr1, 0X25);
delayus(500);
emif16_write(writeaddr1, len-1);
delayus(600);
while(len--)
{
emif16_write(writeaddr1, *(pdata1));
writeaddr1++;
pdata1++;
delayus(2);
}
delayus(2);
emif16_write(writeaddr1, 0x29);
do
{
status = flashStatusRegister();
}while((status & PSB) );
return 0;
}
/************************************************************************
* 函数名称:flashBufferWriteDataNotLen
* 函数说明:向缓冲区写入数据,在指定地址开始写入不定量长度的数据
* 输入参数:readaddr:偏移地址
* pdata:写入的数据
* len:单位长度
* 输出参数:无
* 返回值:无
* 备注:内部调用
* 其他:flash_status_register:读取状态寄存器看是否写入数据成功
************************************************************************/
int flashBufferWriteDataNotLen(unsigned int writeaddr2, unsigned char *pdata2,unsigned int len2)
{
unsigned short numbufferSize;
unsigned short addr;
unsigned short numbufferSingle;
unsigned short count;
unsigned short temp;
if((writeaddr2 % 2) != 0)
{
printf("输入的地址是奇数");
return -1;
}
if(pdata2 == NULL)
{
return -1;
}
/*addr = 0,或写入的字节数是512字节的整数倍*/
addr = writeaddr2 % FLASH_LINE_SIZE;
/*计算出要写入多少buffer缓冲区,*/
numbufferSize = len2 / FLASH_LINE_SIZE;
/*运算求余,得到不满一个缓冲区的数据*/
numbufferSingle = len2 % FLASH_LINE_SIZE;
/*计算出有多少个不对齐的字节数,差多少个数据刚好对齐*/
count = FLASH_LINE_SIZE - addr;
/*addr = 0,写入的地址偏移readaddr2刚好与缓冲区地址对齐*/
if(addr == 0)
{
/*写入的 len < FLASH_LINE_SIZE*/
if(len2 <= FLASH_LINE_SIZE)
{
flashWriteBufferData(writeaddr2, (unsigned short*)pdata2, len2);
}
else /*写入的 len > FLASH_LINE_SIZE, 超过缓冲区的容量*/
{
/*先把整数的buffer空间写了,有几页就写几页*/
while(numbufferSize--)
{
delayus(500);
flashWriteBufferData(writeaddr2, (unsigned short*)pdata2, FLASH_LINE_SIZE);
/*地址偏移增加到下一个缓冲区的地址*/
writeaddr2 += FLASH_LINE_SIZE;
/*写入的数据写到下一个缓冲区*/
pdata2 += FLASH_LINE_SIZE;
}
delayus(500);
/*将不满一个缓冲区的数据写入*/
flashWriteBufferData(writeaddr2, (unsigned short*)pdata2, numbufferSingle);
}
}
/*地址不对齐的情况*/
else
{
if(len2 <=
没有合适的资源?快使用搜索试试~ 我知道了~
DSPTMS320C6678程序固化启动代码,包含bootloader工程,APP工程,下载FLASH工程
共109个文件
pp:19个
c:19个
h:16个
需积分: 0 1 下载量 44 浏览量
2023-12-28
22:10:42
上传
评论
收藏 252KB ZIP 举报
温馨提示
包含TMS320C6678芯片程序的固化流程,APP启动流程代码,中文注释,自己手写包含各种驱动,串口,DDR,EMIF等
资源推荐
资源详情
资源评论
收起资源包目录
DSPTMS320C6678程序固化启动代码,包含bootloader工程,APP工程,下载FLASH工程 (109个子文件)
jump.asm 228B
externalDriver.bin 64KB
userAPP.bin 64KB
bootloader.bin 64KB
userAPP.bin 64KB
norflash.c 11KB
norflash.c 11KB
ddr3.c 8KB
ddr3.c 8KB
psc.c 6KB
psc.c 6KB
uart.c 6KB
uart.c 6KB
pll.c 4KB
pll.c 4KB
main.c 2KB
main.c 2KB
delay.c 2KB
delay.c 2KB
delay.c 2KB
emif16.c 2KB
emif16.c 1KB
main.c 234B
bootloader.c 205B
.ccsproject 433B
.ccsproject 433B
.ccsproject 433B
userapp.ccxml 4KB
writeFLASH.ccxml 4KB
externalDrive.ccxml 4KB
externalDrive.cmd 2KB
userapp.cmd 1KB
externalDrive.cmd 1KB
.cproject 20KB
.cproject 18KB
.cproject 18KB
ddr3.h 7KB
ddr3.h 7KB
pll.h 3KB
pll.h 3KB
emif16.h 2KB
psc.h 2KB
psc.h 2KB
emif16.h 2KB
uart.h 2KB
uart.h 2KB
delay.h 966B
delay.h 966B
delay.h 966B
norflash.h 896B
norflash.h 896B
bootloader.h 556B
makefile 4KB
makefile 3KB
makefile 3KB
externalDrive.map 22KB
bootloader.map 22KB
writeFLASH.map 21KB
userAPP.map 18KB
subdir_rules.mk 4KB
subdir_rules.mk 3KB
sources.mk 2KB
sources.mk 2KB
sources.mk 2KB
subdir_rules.mk 2KB
subdir_vars.mk 1KB
subdir_vars.mk 997B
subdir_vars.mk 663B
objects.mk 250B
objects.mk 250B
objects.mk 250B
ccsObjs.opt 175B
ccsObjs.opt 130B
ccsObjs.opt 68B
main.pp 971B
main.pp 891B
main.pp 747B
bootloader.pp 645B
norflash.pp 535B
norflash.pp 535B
uart.pp 459B
ddr3.pp 459B
ddr3.pp 459B
uart.pp 459B
psc.pp 450B
pll.pp 450B
psc.pp 450B
pll.pp 450B
emif16.pp 127B
emif16.pp 127B
delay.pp 87B
delay.pp 87B
delay.pp 87B
org.eclipse.core.resources.prefs 208B
org.eclipse.core.resources.prefs 208B
org.eclipse.core.resources.prefs 208B
org.eclipse.cdt.debug.core.prefs 123B
org.eclipse.cdt.debug.core.prefs 123B
org.eclipse.cdt.debug.core.prefs 123B
org.eclipse.cdt.codan.core.prefs 62B
共 109 条
- 1
- 2
资源评论
aiqianlimeimei
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功