📄 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: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by: Litiantian
** Modified date: 2006-01-04
** Version:
** Descriptions: 使用LPC2300系列ARM的SSP DMA,操作SST25VF016B。
********************************************************************************************************/
#include "config.h"
/* 宏定义 */
#define FIRSTSEC 0
#define LASTSEC 499
#define ADDR 0x2007
#define WRBYTES_N 8
#define SNDBYTES_N 5
#define SRC_RAMBUF 0x7FD00000 // DMA发送操作中源存储区起始地址
#define DST_RAMBUF 0x7FD01000 // DMA接收操作中目标存储区起始地址
#define SSP0DR_ADDR 0xE0068008 // SSP0的FIFO存储器之地址
/* 全局变量定义 */
uint8 WrDat[10] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; // 该数组用以存放要被写入Flash的8个数据,仅由SSTF016B_WR函数访问
uint8 SndBuf[10] = {0x0B,0x0,0x20,0x07,0xFF}; // 该数组用于存放对FLASH的操作信息,仅由SSPDMA_Snd函数访问
/*******************************************************************************************
** 函数名称:SSPDMA_SndIni
** 功能说明:初始化LPC2300系列ARM SSP DMA发送
** 入口参数:无
** 出口参数:无
*******************************************************************************************/
void SSPDMA_SndIni(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;
}
/*******************************************************************************************
** 函数名称:SSPDMA_Snd
** 功能说明:LPC2300系列ARMSSP DMA发送功能。
** 入口参数:uint8 burstsndN 用户在此处设定要以DMA方式传输的字节数目
** uint8* snddatpt 发送数据缓存
** 出口参数:无
*******************************************************************************************/
void SSPDMA_Snd(uint8 burstsndN, uint8* snddatpt)
{
uint32 i = 0;
/* DMA传输启动前的准备 */
for(i = 0;i < burstsndN;i++)
{
(*(uint8*)(SRC_RAMBUF + i)) = snddatpt[i];
}
DMACC1Control |= burstsndN; // 指定突发传输次数
/* DMA传输启动 */
DMACC1Configuration |= 0x01; // 使能DMA通道1
SSP0DMACR = 0x02; // 使能SSP0的发送DMA,此时DMA传输启动
/* DMA数据传输中 */
while ((DMACIntTCStatus & 0x02) == 0); // 等待通道1传输完毕
/* DMA传输结束 */
DMACC1SrcAddr = SRC_RAMBUF; // 复位DMA源地址计数器
/* SSP数据发送 */
while ( (SSP0SR & 0x10) == 0x10 ); // 等待SSP0 FIFO中的数据发送完毕
}
/********************************************************************************************************
** 函数名称:SSPDMA_RcvIni
** 函数功能:初始化LPC2300系列ARM SSP DMA接收
** 入口参数:无
** 出口参数:无
********************************************************************************************************/
void SSPDMA_RcvIni(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
}
/*******************************************************************************************
** 函数名称:SSPDMA_Rcv
** 功能说明:LPC2300系列ARM SSP DMA接收功能。
** 入口参数:uint8 burstsndN 用户在此处设定要以DMA方式传输的字节数目
** uint8* snddatpt 发送数据缓存
** 出口参数:无
*******************************************************************************************/
void SSPDMA_Rcv(void)
{
uint32 i = 0;
/* 清空接收FIFO */
do
{
i = SSP0DR; // 读取接收FIFO中的数据
}
while ((SSP0SR & 0x04) == 0x04); // 接收FIFO为空时,读操作结束
/* 读取Flash返回的数据 */
for (i = 0; i < 8; i++)
{
SSP0DR = 0xff;
while ( (SSP0SR & 0x10) != 0x10 ); // 等SSP控制器空闲
}
/* 等待接收FIFO满 */
while((SSP0SR & 0x08) != 0x08);
/* DMA传输启动 */
DMACC0Configuration |= 0x01; // 使能DMA通道0
SSP0DMACR |= 0x01; // 启动SSP接收DMA
/* DMA传输中 */
while ((DMACIntTCStatus & 0x01) == 0); // 等待通道0传输完毕
/* DMA传输结束 */
DMACC0DestAddr = DST_RAMBUF;
}
/********************************************************************************************************
** 函数名称:main
** 函数功能:调用软件包,演使用SSP DMA操作SST25VF016B
** 入口参数:无
** 出口参数:返回0则表明出错
********************************************************************************************************/
int main (void)
{
SSP_Init(); // 初始化SSP管脚以及SSP的工作参数
PCONP |= 1 << 29; // 在功率管理寄存器里启用GPDMA
SSPDMA_SndIni();
SSPDMA_RcvIni();
// SSTF016B_Erase(FIRSTSEC,LASTSEC); // 全片擦除
// SSTF016B_WR(ADDR,WrDat,WRBYTES_N); // 将1~8写入从地址0x2007开始的Flash存储单元里
CE_Low();
SSPDMA_Snd(SNDBYTES_N,SndBuf);
SSPDMA_Rcv();
CE_High();
while(1);
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -