📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example
**
**------------------------------------------------------------------------------------------------------
** Created by: Litiantian
** Created date: 2006-01-04
** Version: 1.0
** Descriptions: 使用LPC2300系列ARM的SSP DMA,操作SST25VF016B。
**
**------------------------------------------------------------------------------------------------------
** Modified by: liuyanlong
** Modified date: 2007-09-03
** Descriptions: 对代码风格和注释进行了规范、校对
********************************************************************************************************/
#include "config.h"
/* 宏定义 */
#define GPDMA_INT 25 // GPDMA中断通道号
#define FIRSTSEC 0
#define LASTSEC 499
#define ADDR 0x2007
#define WRBYTES_N 8
#define SRC_RAMBUF 0x7FD00000 // DMA发送操作中源存储区起始地址
#define DST_RAMBUF 0x7FD01000 // DMA接收操作中目标存储区起始地址
#define SSP0DR_ADDR 0xE0068008 // SSP0的FIFO存储器之地址
/* 等待发送FIFO为空 等SSP控制器空闲 */
#define WaitSSPSndEnd() while ((SSP0SR & 0x01) == 0); while ((SSP0SR & 0x10) == 0x10)
/* 等待SSP接收FIFO满 */
#define WaitRcvFIFOFUL() while ((SSP0SR & 0x08) != 0x08)
/* 全局变量定义 */
uint8 InitDatas[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
uint8 RdCmdBuf[5] = {0x0B, 0x0, 0x20, 0x07, 0xFF}; // 该数组用于存放对FLASH的读操作初始化信息,仅由SSPDMA_Snd函数访问,发送完这组数据后,Flash进入读数据状态
uint8 WaitCmdbuf[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; // 每发送一个0xff到Flash,Flash会返回一个数据
/*******************************************************************************************
** 函数名称:SSPDMA_SndInit
** 功能说明:初始化LPC2300系列ARM SSP DMA发送
** 入口参数:无
** 出口参数:无
*******************************************************************************************/
void SSPDMA_SndInit(void)
{
/* 初始化DMA传输流 */
DMACC1LLI = 0; // 下一个链表项无效,本次DMA传输流使用连续存储空间
DMACC1Configuration |= (0x01 << 11); // 初始化流的源和目标为从存储器到外设,以及流控制器为DMA控制器
DMACC1Control |= (0x02 << 12) // 指定源突发传输大小为8位
| (0x00 << 18); // 指定源传输数据宽度为8位
DMACC1Control |= 0x80000000; // 配置传输流的中断,使能通道1的终端计数中断
DMACC1Configuration |= 0x00008000; // 不对通道1的终端计数中断进行屏蔽
/* 初始化源和目标 */
DMACC1SrcAddr = SRC_RAMBUF; // 设置DMA的源为USB的RAM区
DMACC1DestAddr = SSP0DR_ADDR; // 设置DMA传输目标为SSP0的FIFO
DMACC1Control |= (1 << 26) // 指定源地址自动增加
| (0 << 27); // 指定目标地址不自动增加
/* 初始化结束,使能GPDMA */
DMACConfiguration |= 0x01;
/* 使能SSP 发送DMA */
SSP0DMACR = 0x02;
}
/*******************************************************************************************
** 函数名称:SSPDMA_Snd
** 功能说明:LPC2300系列ARMSSP DMA发送功能。
** 入口参数:uint8 burstsndN 用户在此处设定要以DMA方式传输的字节数目
** uint8* snddatpt 发送数据缓存
** 出口参数:无
*******************************************************************************************/
void SSPDMA_Snd(uint8 burstsndN, uint8* snddatpt)
{
uint32 i = 0;
/* DMA传输启动前,将数据送入DMA发送操作中的源存储区 */
for (i = 0; i < burstsndN; i++)
{
(*(uint8*)(SRC_RAMBUF + i)) = snddatpt[i];
}
DMACC1Control |= burstsndN; // 指定突发传输次数
/* DMA传输启动 */
DMACC1Configuration |= 0x01; // 使能DMA通道1
}
/********************************************************************************************************
** 函数名称:SSPDMA_RcvInit
** 函数功能:初始化LPC2300系列ARM SSP DMA接收
** 入口参数:无
** 出口参数:无
********************************************************************************************************/
void SSPDMA_RcvInit(void)
{
/* 初始化DMA传输流 */
DMACC0LLI = 0;
DMACC0Configuration |= (0x01 << 12) // 指定数据从外设传输到存储器,DMA为流控制器
| (0x01 << 1); // 指定DMA源请求外设为SSP0的接收FIFO
DMACC0Control |= 0x08 // 指定突发传输次数为8
| (0x02 << 12) // 指定源突发的传输大小为8位
| (0x00 << 18) // 指定源传输数据宽度为8位
| 0x80000000
| (0 << 26) // 指定源地址不自动增加
| (1 << 27); // 指定目标地址自动增加
DMACC0Configuration |= 0x00008000;
DMACC0SrcAddr = SSP0DR_ADDR;
DMACC0DestAddr = DST_RAMBUF;
DMACConfiguration |= 0x01; // 使能DMA
SSP0DMACR |= 0x01; // 使能SSP接收DMA
}
/********************************************************************************************************
** 函数名称:GPDMA_ISR
** 函数功能:GPDMA中断服务函数
** 入口参数:无
** 出口参数:无
********************************************************************************************************/
void __irq GPDMA_ISR(void)
{
if ((DMACIntStatus & 0x01) != 0) // 通道0,接收通道
{
if ((DMACIntTCStatus & 0x01) != 0) // 计数中断
{
DMACC0DestAddr = DST_RAMBUF; // 复位DMA目的地址计数器
DMACIntTCClear = 0x01;
}
}
if ((DMACIntStatus & 0x02) != 0) // 通道1,发送通道
{
if ((DMACIntTCStatus & 0x02) != 0) // 计数中断
{
DMACC1SrcAddr = SRC_RAMBUF; // 复位DMA源地址计数器
DMACIntTCClear = 0x02;
}
}
VICVectAddr = 0x00;
}
/*********************************************************************************************************
** 函数名称: GPDMA_IRQIni
** 功能描述: 进行向量IRQ初始化操作
** 入口参数:无
** 出口参数:无
********************************************************************************************************/
void GPDMA_IRQIni(void)
{
VICIntEnClr |= (1 << GPDMA_INT);
VICVectPri25 = 0x06;
VICVectAddr25 = (uint32)GPDMA_ISR;
VICIntEnable |= (1 << GPDMA_INT);
IRQEnable();
}
/*********************************************************************************************************
** 函数名称: Clr_RcvFIFO
** 功能描述: 清空SSP接收FIFO
** 入口参数:无
** 出口参数:无
********************************************************************************************************/
void Clr_RcvFIFO(void)
{
volatile uint8 tmp = 0;
do
{
tmp = SSP0DR;
}
while ((SSP0SR & 0x04) == 0x04);
}
/********************************************************************************************************
** 函数名称:main
** 函数功能:调用软件包,演示使用SSP DMA操作SST25VF016B
** 入口参数:无
** 出口参数:返回0则表明出错
** 调试说明:在Flash中运行
********************************************************************************************************/
int main(void)
{
PCONP |= 1 << 29; // 在功率管理寄存器里启用GPDMA
/* 完成SSP和GPDMA的初始化 */
SSP_Init(); // 初始化SSP管脚以及SSP的工作参数
SSPDMA_SndInit(); // 通道1作发送通道
SSPDMA_RcvInit(); // 通道0作接收通道
GPDMA_IRQIni(); // 在VIC里初始化DMA中断
/* 准备好将从Flash读出的数据1~8 */
SSTF016B_Erase(FIRSTSEC, LASTSEC); // 全片擦除
SSTF016B_WR(ADDR, InitDatas, WRBYTES_N); // 将1~8写入从地址0x2007开始的Flash存储单元里
/* 中断方式下DMA发送和接收 */
SSTF016B_CELow();
/* 中断方式DMA发送 */
SSPDMA_Snd(sizeof(RdCmdBuf), RdCmdBuf); // DMA将读操作初始化信息传输至SSP 发送FIFO,在此处观察SRC_RAMBUF的内容
WaitSSPSndEnd(); // 等待SSP发送结束,发送结束后,Flash进入读操作状态
Clr_RcvFIFO(); // 清空SSP接收FIFO
/* 中断方式DMA接收 */
SSPDMA_Snd(sizeof(WaitCmdbuf), WaitCmdbuf); // 发送等待信息,以读取Flash数据
WaitRcvFIFOFUL(); // 等待接收FIFO满,接收FIFO满了后即启动DMA接收
DMACC0Configuration |= 0x01; // 启动DMA通道0
SSTF016B_CEHigh();
while (1);
return (0);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -