📄 test.c
字号:
/****************************************************************************
* 文件名:TEST.C
* 功能:EasyARM2200开发板出厂编程程序。
* 说明:将跳线器JP5、JP8短接。
****************************************************************************/
#include "config.h"
#define ZLG7290 0x70 /* 定义器件地址 */
#define SPI_CS 0x00000100 /* P0.8 */
#define SPI_DATA 0x00000040 /* P0.6 */
#define SPI_CLK 0x00000010 /* P0.4 */
#define SPI_IOCON 0x00000150 /* 定义SPI接口的I/O设置字 */
#define BEEPCON 0x00000080 /* P0.7引脚控制B1,低电平蜂鸣 */
uint8 disp_buf[8]; // 8位数码管显示缓冲区,由ZLG7290控制数码管显示
/****************************************************************************
* 名称:DelayNS()
* 功能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<5000; i++);
}
/****************************************************************************
* 名称:BeepRun()
* 功能:蜂鸣器BEEP响。
* 入口参数:dly 蜂鸣器延时控制
* 出口参数:无
****************************************************************************/
void BeepRun(uint8 dly)
{
IO0CLR = BEEPCON; // BEEPCON = 0
DelayNS(dly);
IO0SET = BEEPCON; // BEEPCON = 1
DelayNS(dly);
}
/****************************************************************************
* 名称:HC595_SendDat()
* 功能:向74HC595发送一字节数据
* 入口参数:dat 要发送的数据
* 出口参数:无
* 说明:发送数据时,高位先发送。
****************************************************************************/
void HC595_SendDat(uint8 dat)
{ uint8 i;
IO0CLR = SPI_CS; // SPI_CS = 0
for(i=0; i<8; i++) // 发送8位数据
{ IO0CLR = SPI_CLK; // SPI_CLK = 0
/* 设置SPI_DATA输出值 */
if( (dat&0x80)!=0 ) IO0SET = SPI_DATA;
else IO0CLR = SPI_DATA;
dat <<= 1;
IO0SET = SPI_CLK; // SPI_CLK = 1
}
IO0SET = SPI_CS; // SPI_CS = 1,输出显示数据
}
/****************************************************************************
* 名称:DispDataBitLSL()
* 功能:将数据从8位数码管的最右端,逐步左移到指定显示位上显示。
* 入口参数:dat 显示数据
* objno 目标显示位
* dly 移动延时控制
* 出口参数:无
* 说明:使用disp_buf显示缓冲区
****************************************************************************/
void DispDataBitLSL(uint8 dat, uint8 objno, uint8 no)
{ uint8 i;
if(objno>7) return;
disp_buf[0] = dat; // 第0位显示为dat
ZLG7290_SendBuf(disp_buf,8);
DelayNS(no);
for(i=0; i<objno; i++)
{ disp_buf[i] = 0x1F;
disp_buf[i+1] = dat; // 第i+1位显示为dat
ZLG7290_SendBuf(disp_buf,8);
DelayNS(no);
}
}
/****************************************************************************
* 名称:I2C_Init()
* 功能:主模式I2C初始化,包括初始化其中断为向量IRQ中断。
* 入口参数:fi2c 初始化I2C总线速率,最大值为400K
* 出口参数:无
****************************************************************************/
void I2C_Init(uint32 fi2c)
{ if(fi2c>400000) fi2c = 400000;
PINSEL0 = (PINSEL0&0xFFFFFF0F) | 0x50; // 设置I2C控制口有效
I2SCLH = (Fpclk/fi2c + 1) / 2; // 设置I2C时钟为fi2c
I2SCLL = (Fpclk/fi2c) / 2;
I2CONCLR = 0x2C;
I2CONSET = 0x40; // 使能主I2C
/* 设置I2C中断允许 */
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl0 = 0x29; // I2C通道分配到IRQ slot 0,即优先级最高
VICVectAddr0 = (int)IRQ_I2C; // 设置I2C中断向量地址
VICIntEnable = 0x0200; // 使能I2C中断
}
// 显示段定义(用于ZLG7290,直接写显示寄存器)
#define SA 0x80
#define SB 0x40
#define SC 0x20
#define SD 0x10
#define SE 0x08
#define SF 0x04
#define SG 0x02
#define SH 0x01
#define ND 0x00
// 字模定义
#define CHAR_N (SA|SB|SC|SE|SF)
#define CHAR_E (SA|SD|SE|SF|SG)
#define CHAR_t (SD|SE|SF|SG)
#define CHAR_U (SB|SC|SD|SE|SF)
#define CHAR_S (SA|SC|SD|SF|SG)
#define CHAR_b (SC|SD|SE|SF|SG)
#define CHAR_C (SA|SD|SE|SF)
#define CHAR_0 (SA|SB|SC|SD|SE|SF)
#define CHAR_2 (SA|SB|SD|SE|SG)
#define CHAR_DOT SH
#define CHAR_r (SE|SG)
const uint8 DISP_TAB[] = { SA|SB|SC|SD|SE|SF, // 0
SB|SC, // 1
SA|SB|SD|SE|SG, // 2
SA|SB|SC|SD|SG, // 3
SB|SC|SF|SG, // 4
SA|SC|SD|SF|SG, // 5
SA|SC|SD|SE|SF|SG, // 6
SA|SB|SC, // 7
SA|SB|SC|SD|SE|SF|SG, // 8
SA|SB|SC|SD|SF|SG, // 9
SA|SB|SC|SE|SF|SG, // A
SC|SD|SE|SF|SG, // b
SA|SD|SE|SF, // C
SB|SC|SD|SE|SG, // d
SA|SD|SE|SF|SG, // E
SA|SE|SF|SG // F
};
// 流水灯控制数据
const uint8 playled1[] = { SB|SD,
SA|ND,
ND|SD,
SA|ND,
ND|SD,
SA|ND,
ND|SD,
SA|SE
};
const uint8 pled8a = 0x55;
const uint8 playled2[] = { SA|SC,
ND|SD,
SA|ND,
ND|SD,
SA|ND,
ND|SD,
SA|ND,
SF|SD
};
const uint8 pled8b = 0xAA;
/////////////////////////////////////////////////////////////////////////////
const uint32 WriteData[] = {0x55555555, 0xaaaaaaaa, 0xffffffff, 0};
/****************************************************************************
* 名称:SysCheck_RAM()
* 功能:SRAM测试。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void SysCheck_RAM(void)
{ volatile uint32 *cp; // 设置32位指针(RAM地址,volatile属性)
uint32 temp;
uint32 i;
uint8 j;
uint8 err;
uint8 ch;
// 清除LED屏幕显示
for(i=0; i<8; i++) disp_buf[i] = 0x1F;
ZLG7290_SendBuf(disp_buf,8);
// 检测SRAM。显示"Sr xxxxx"或显示"Errxxxxx"
ZLG7290_SendData(0x10+7, CHAR_S);
ZLG7290_SendData(0x10+6, CHAR_r);
ZLG7290_SendData(0x10+5, ND);
ZLG7290_SendData(0x10+4, SG);
ZLG7290_SendData(0x10+3, SG);
ZLG7290_SendData(0x10+2, SG);
ZLG7290_SendData(0x10+1, SG);
ZLG7290_SendData(0x10+0, SG);
// 清零SRAM
cp = (uint32 *) 0x81000000; // 设置SRAM起始地址
for (i = 0; i < 0x00080000; i += 4)
{ *cp++ = 0; // 写0操作
}
// 读/写校验
cp = (uint32 *) 0x81000000;
for (i = 0; i < 0x00080000; i += 4)
{ err = 0;
// 判断是否需要更新地址显示
if((i&0x0FFF) == 0x0000)
{ ZLG7290_SendData(0x10+7, CHAR_S);
ZLG7290_SendData(0x10+6, CHAR_r);
ZLG7290_SendData(0x10+5, ND);
ch = (i>>16)&0x0F;
ZLG7290_SendData(0x10+4, DISP_TAB[ch]);
ch = (i>>12)&0x0F;
ZLG7290_SendData(0x10+3, DISP_TAB[ch]);
ZLG7290_SendData(0x10+2, DISP_TAB[8]);
ZLG7290_SendData(0x10+1, DISP_TAB[8]);
ZLG7290_SendData(0x10+0, DISP_TAB[8]);
}
temp = cp[0]; // 读取数据,校验是否为0
if (temp != 0)
{ err = 1;
}
// 写数效验
j = 0;
while (1)
{ cp[0] = WriteData[j];
temp = cp[0];
if (temp != WriteData[j])
{ err = 1;
}
j++;
if (WriteData[j] == 0)
{ break;
}
}
// 判断是否有错误,若有则显示相应的地址信息
if(err == 1)
{ ZLG7290_SendData(0x10+7, CHAR_E);
ZLG7290_SendData(0x10+6, CHAR_r);
ZLG7290_SendData(0x10+5, CHAR_r);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -