📄 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 template
**
**------------------------------------------------------------------------------------------------------
** Created by: zhangmingjie
** Created date: 2007-3-26
** Version: 1.0
** Descriptions: 使用硬件I2C对E2PROM进行操作,利用中断方式操作。
** 向CAT24WC256中0x03f1地址(高位是0x03,低位是0xf1)处写入10个数据,然后
** 读回校验,正确的话蜂鸣器鸣叫1声,否则连续鸣叫。
** 说 明: 本实验是介绍如何利用zlg的I2C软件包进行对有双子地址的E2PROM器件的读写操作,
** 带双子地址的E2PROM有CAT24WC32/64/128/256等,而CAT24WC01/02是单子地址的,
** 同时一些I2C器件是无子地址或者是3+x类型的,用户在使用时一定要注意API函数的选择和使用。
**------------------------------------------------------------------------------------------------------
** Modified by: yangshiping
** Modified date: 2007-09-03
** Version:
** Descriptions: 对程序的风格以及注释略作调整,并检查代码。
**
** Rechecked by: Litiantian
************************************************************************************************************/
#include "config.h"
#define CAT24WC256 0xA2 // 定义器件地址
#define BEEPCON (1 << 27)
uint8 data_buf[30];
/****************************************************************************
** 函数名称:I2C_Init
** 函数功能:主模式I2C初始化,包括初始化其中断为向量IRQ中断。
** 入口参数:fi2c 初始化I2C总线速率,最大值为400K
** 出口参数:无
****************************************************************************/
void I2C_Init(uint32 fi2c)
{
if (fi2c > 400000)
{
fi2c = 400000;
}
PINSEL1 = (PINSEL1 & ~(0xff << 22)) | (0x05 << 22); // 设置I2C控制口有效,P0.27、P0.28
I2SCLH = (Fpclk / fi2c + 1) / 2; // 设置I2C时钟为fi2c
I2SCLL = (Fpclk / fi2c) / 2;
I2CONCLR = 0x2C;
I2CONSET = 0x40; // 使能主I2C
/* 设置I2C中断允许 */
VICIntSelect = 0x00; // 所有中断通道设置为IRQ中断
VICVectPri9 = 00; // 设I2C中断最高优先级
VICVectAddr9 = (uint32)IRQ_I2C; // 设置中断服务程序地址
VICIntEnable = 1 << 0x09; // 使能I2C中断
}
/****************************************************************************
** 函数名称:DelayNS
** 函数功能:长软件延时
** 入口参数:dly 延时参数,值越大,延时越久
** 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{
uint32 i;
for (; dly > 0; dly--)
for (i = 0; i < 50000; i++);
}
/****************************************************************************
** 函数名称:WrEepromErr
** 函数功能:读写EEPRM出错蜂鸣报警。
** 入口参数:无
** 出口参数:无
****************************************************************************/
void WrE2promErr(void)
{
while (1)
{
IO1SET = BEEPCON;
DelayNS(3);
IO1CLR = BEEPCON;
DelayNS(3);
}
}
/****************************************************************************
** 函数名称:main
** 函数功能:向E2PROM写入10字节数据,然后读出判断是否正确写入。
** 函数说明:1、在CONFIG.H文件中包含I2CINT.H;
** 2、在Flash中进行调试。
****************************************************************************/
int main(void)
{
uint8 i;
PINSEL1 = 0x00000000;
IO1DIR = BEEPCON;
IO1SET = BEEPCON;
I2C_Init(100000); // I2C初始化
IRQEnable();
for (i = 0; i < 10; i++)
{
data_buf[i] = i + '0';
}
/* 往起始地址0x03f1开始写入10个数据 */
I2C_WriteNByte(CAT24WC256, TWO_BYTE_SUBA, 0x03f1, data_buf, 10);
DelayNS(10);
/* 清零数据缓冲区,防止出错 */
for (i = 0; i < 10; i++)
{
data_buf[i] = 0;
}
/* 从起始地址0x03f1读回刚才写入的数据 */
I2C_ReadNByte(CAT24WC256, TWO_BYTE_SUBA, 0x03f1, data_buf, 10);
/* 校验读出的数据,若不正确则蜂鸣报警 */
for (i = 0; i < 10; i++)
{
if (data_buf[i] != (i + '0'))
{
WrE2promErr();
}
}
IO1CLR = BEEPCON;
DelayNS(30);
IO1SET = BEEPCON;
while (1);
return (0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -