?? 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: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by: Chenxibing
** Modified date: 2005-02-04
** Version: V1.0
** Descriptions: I2C從機實驗從機程序
**
********************************************************************************************************/
/********************************************************************************************************
** 文件名:main().C
** 功能:使用LPC2131模擬EEPROM器,設從機地址為LPC2131_SLV。LPC2131具有硬件I2C接口,使用其從方式進行
** I2C器件模擬,本例使用了256字節的RAM作為存儲單元。
** 說明:P0.2、P0.3直接通過杜邦線掛到主機I2C總線上。
********************************************************************************************************/
#include "config.h"
#define LPC2131_SLV 0xb0 /* 定義從機地址 */
#define LED1 1 << 18; /* P1.18 LED1控制口 */
uint8 eeprom[256]; /* 定義EEPROM存儲單元,256字節 */
uint8 adrpoint; /* 定義EEPROM讀寫操作指針 */
uint8 slarv; /* 定義子地址接收標志,為1時表示己接收從機地址 */
/********* 該函數用于測試 ********/
void delay (uint32 dly)
{ uint32 i;
for ( ; dly>0; dly--)
for (i=0; i<50000; i++);
}
/********************************************************************************************************
** 函數名稱:IRQ_I2C()
** 函數功能:I2C中斷服務函數,實規從機操作。
** 入口參數:無
** 出口參數:無
********************************************************************************************************/
void __irq IRQ_I2C(void)
{ uint8 sta;
sta = I2STAT; // 取得I2C狀態字
sta &= 0xF8;
switch(sta)
{ case 0x60: // 接收到自身SLA+W
case 0x68:
slarv = 0;
I2CONSET = 0x04;
break;
case 0xA8: // 接收到SLA+R,或已發送數據并接收到ACK位。
case 0xB0:
case 0xB8:
I2DAT = eeprom[adrpoint];
adrpoint++;
I2CONSET = 0x04;
break;
case 0x80: // 接收到數據
if(0==slarv)
{ adrpoint = I2DAT;
slarv = 1;
}
else
{ eeprom[adrpoint] = I2DAT;
adrpoint++;
}
I2CONSET = 0x04;
break;
case 0xA0: // 已發送數據,并接收到非ACK
case 0xC0: // 總線結束,或總線重新啟動
default: // 其它狀態
I2CONSET = 0x04;
break;
}
I2CONCLR = 0x38; // 清除標I2C標志位,STA、STO、SI
VICVectAddr = 0x00;
}
/*********************************************************************************************************
** 函數名稱:I2C_SlaveInit()
** 函數功能:從模式I2C初始化,包括初始化其中斷為向量IRQ中斷。
** 入口參數:adr 本從機地址
** 出口參數:無
********************************************************************************************************/
void I2C_SlavInit(uint8 adr)
{
PINSEL0 = (PINSEL0&0xFFFFFF0F) | 0x50; // 設置I2C控制口有效
I2ADR = adr&0xFE; // 設置從機地址
I2CONCLR = 0x28;
I2CONSET = 0x44; // I2C配置為從機模式
/* 設置I2C中斷允許 */
VICIntSelect = 0x00000000; // 設置所有通道為IRQ中斷
VICVectCntl0 = 0x29; // I2C通道分配到IRQ slot 0,即優先級最高
VICVectAddr0 = (int)IRQ_I2C; // 設置I2C中斷向量地址
VICIntEnable = 0x0200; // 使能I2C中斷
}
/********************************************************************************************************
** 函數名稱:main()
** 函數功能:初始化I2C口連接,并初始化向量中斷控制器。
** 函數說明:
********************************************************************************************************/
int main(void)
{
adrpoint = 0;
slarv = 0;
IO1DIR = LED1;
IRQEnable(); // 使能IRQ中斷
I2C_SlavInit(LPC2131_SLV);
while(1) // 等待中斷
{ /* 讓LED1閃爍,讓用戶感覺程序在運行 */
IO1SET = LED1;
delay(20);
IO1CLR = LED1;
delay(20);
}
return(0);
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -