?? 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個數(shù)據(jù),然后
** 讀回校驗,正確的話蜂鳴器鳴叫1聲,否則連續(xù)鳴叫。
** 說 明: 本實驗是介紹如何利用zlg的I2C軟件包進行對有雙子地址的E2PROM器件的讀寫操作,
** 帶雙子地址的E2PROM有CAT24WC32/64/128/256等,而CAT24WC01/02是單子地址的,
** 同時一些I2C器件是無子地址或者是3+x類型的,用戶在使用時一定要注意API函數(shù)的選擇和使用。
**------------------------------------------------------------------------------------------------------
** 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];
/****************************************************************************
** 函數(shù)名稱:I2C_Init
** 函數(shù)功能:主模式I2C初始化,包括初始化其中斷為向量IRQ中斷。
** 入口參數(shù):fi2c 初始化I2C總線速率,最大值為400K
** 出口參數(shù):無
****************************************************************************/
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中斷最高優(yōu)先級
VICVectAddr9 = (uint32)IRQ_I2C; // 設置中斷服務程序地址
VICIntEnable = 1 << 0x09; // 使能I2C中斷
}
/****************************************************************************
** 函數(shù)名稱:DelayNS
** 函數(shù)功能:長軟件延時
** 入口參數(shù):dly 延時參數(shù),值越大,延時越久
** 出口參數(shù):無
****************************************************************************/
void DelayNS(uint32 dly)
{
uint32 i;
for (; dly > 0; dly--)
for (i = 0; i < 50000; i++);
}
/****************************************************************************
** 函數(shù)名稱:WrEepromErr
** 函數(shù)功能:讀寫EEPRM出錯蜂鳴報警。
** 入口參數(shù):無
** 出口參數(shù):無
****************************************************************************/
void WrE2promErr(void)
{
while (1)
{
IO1SET = BEEPCON;
DelayNS(3);
IO1CLR = BEEPCON;
DelayNS(3);
}
}
/****************************************************************************
** 函數(shù)名稱:main
** 函數(shù)功能:向E2PROM寫入10字節(jié)數(shù)據(jù),然后讀出判斷是否正確寫入。
** 函數(shù)說明: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個數(shù)據(jù) */
I2C_WriteNByte(CAT24WC256, TWO_BYTE_SUBA, 0x03f1, data_buf, 10);
DelayNS(10);
/* 清零數(shù)據(jù)緩沖區(qū),防止出錯 */
for (i = 0; i < 10; i++)
{
data_buf[i] = 0;
}
/* 從起始地址0x03f1讀回剛才寫入的數(shù)據(jù) */
I2C_ReadNByte(CAT24WC256, TWO_BYTE_SUBA, 0x03f1, data_buf, 10);
/* 校驗讀出的數(shù)據(jù),若不正確則蜂鳴報警 */
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 + -