亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? i2c.c

?? 在keil-ARM環境下對ARM7處理器編譯成功的I2C總線程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*********************************************************************************************************
**文件名稱:I2CINT.c
**功能說明:硬件I2C中斷方式軟件包。
**使用說明:軟件包采用中斷方式進行操作。
********************************************************************************************************/
#include "config1.h"

/*定義用于和I2C中斷傳送信息的全局變量*/
volatile	uint8	slarv;			//子地址接收標志,為1時表示已接收從機子地址
volatile	uint32	adrpoint;		//定義從機緩沖區讀寫操作指針
volatile	uint8	I2C_n;			//I2C器件順序號
volatile	uint8	I2C_sla;		//I2C器件從地址
volatile	uint32	I2C_suba;		//I2C器件的內部子地址
volatile	uint8	I2C_suba_num;	//I2C子地址字節數
volatile	uint8	*I2C_buf;		//I2C數據緩沖區指針,
									//如果要將I2C接口設置為從機模式,
									//那么,在調用軟件包前要設置I2C數據緩沖區指針 I2C_buf
volatile	uint32	I2C_num;		//要讀取/寫入的數據個數
volatile	uint8	I2C_end;		//I2C總線結束標志:結束總線時置1
volatile	uint8	I2C_suba_en;	/*	子地址控制
										0-子地址已經處理或者不需要子地址
										1-讀取操作
										2-寫操作
									*/	
/*********************************************************************************************************
**函數名稱:IRQ_I2C()
**函數功能:硬件I2C服務程序
**入口參數:無
**出口參數:無
**說明:注意處理子地址為2字節的情況
********************************************************************************************************/
void  IRQ_I2C(void)
{
	/*	讀取I2C狀態寄存器I2STAT
		按照全局變量的設置進行操作及設置軟件標志
		清除中斷邏輯,中斷返回
	*/
	uint8 stat;		//用來讀取I2C狀態寄存器I2STAT
	stat = *((volatile uint32 *)(&I2C0STAT) + (I2C_n*0x10000));	//讀取I2STAT,I2STAT=0xE001C004
	switch(stat & 0xF8)
	{
	/*根據狀態碼進行相應的處理*/
		case 	0x08:	/*已發送起始條件*/		//主發送和主接收都有
			/*裝入SLA+W或者SLA+R*/
			if(I2C_suba_en == 1)	/*SLA+R*/	//指定子地址讀
			{
				*((volatile uint32 *)(&I2DAT) + (I2C_n*0x10000)) = I2C_sla &0xfe;	//先寫入地址
			}
			else	/*SLA+W*/
			{
				*((volatile uint32 *)(&I2DAT) + (I2C_n*0x10000)) = I2C_sla &0xfe;	//直接發送從機地址
			}
			/*清零SI位*/
			*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = (1<<3)|	//SI
																  (1<<5);	//STA
			break;
		case	0x10:	/*已發送重復起始條件*/	//主發送和主接收都有
			/*裝入SLA+W或者SLA+R*/
			*((volatile uint32 *)(&I2DAT) + (I2C_n*0x10000)) = I2C_sla;	//重起總線后,重發從地址
			*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000))= 0x28;	//清零SI,STA
			break;
		case	0x18:
		case	0x28:	/*已發送I2DAT中的數據,已接收ACK*/
			if(I2C_suba_en == 0)
			{
				if(I2C_num > 0)		//如果還有數據需要讀取
				{
					*((volatile uint32 *)(&I2DAT) + (I2C_n*0x10000)) = *I2C_buf++;	//讀取數據
					*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = 0x28;		//清零SI,STA
					I2C_num--;		//字節數減1
				}
				else	/*沒有數據發送了*/
				{
					/*停止總線*/
					*((volatile uint32 *)(&I2CONSET) + (I2C_n*0x10000)) = (1<<4);	//STO
					*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = 0x28;		//清零SI,STA
					I2C_end = 1;	//總線已經停止
				}
			}
			if(I2C_suba_en == 1)	/*若是指定地址讀,則重新啟動總線*/
			{
				if(I2C_suba_num == 2)			//如果是雙字節子地址
				{
					*((volatile uint32 *)(&I2DAT) + (I2C_n*0x10000)) = ((I2C_suba>>8) & 0xff);	//先發送地址字節
					*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = 0x28;					//清零SI,STA
					I2C_suba_num--;				//子地址字節數減1
					break;
				}
				if(I2C_suba_num == 1)			//如果是雙字節子地址
				{
					*((volatile uint32 *)(&I2DAT) + (I2C_n*0x10000)) = (I2C_suba & 0xff);	//發送子地址低字節或單字節子地址
					*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = 0x28;				//清零SI,STA
					I2C_suba_num--;				
					break;
				}
				if(I2C_suba_num == 0)	
				{
					*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = 0x08;		//清零SI
					*((volatile uint32 *)(&I2CONSET) + (I2C_n*0x10000)) = 0x20;		//置位STA
					I2C_suba_en = 0;			//子地址已經處理
					break;
				}				
			}
			if(I2C_suba_en == 2)	/*指定子地址寫,子地址尚未指定,則發送子地址*/
			{
				if(I2C_suba_num > 0)			
				{
					if(I2C_suba_num == 2)		//如果是雙字節子地址
					{
					  	*((volatile uint32 *)(&I2DAT) + (I2C_n*0x10000)) =((I2C_suba>>8) & 0xff);	//先發送子地址高字節
						*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) =0x28;					//清零SI,STA
						I2C_suba_num--;				//子地址字節數減1
						break;				
					}
					if(I2C_suba_num == 1)			//如果是雙字節子地址
					{
					  	*((volatile uint32 *)(&I2DAT) + (I2C_n*0x10000)) =(I2C_suba & 0xff);	//發送子地址低字節或單字節子地址
						*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) =0x28;				//清零SI,STA
						I2C_suba_num--;				
						I2C_suba_en = 0;
						break;
					}					
				}				
			}			
			break;
		case	0x40:	/*已發送SLA+R,已接收ACK*/
			if(I2C_num <= 1)	/*如果是最后一個字節*/
			{
				*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) =1<<2;	//下次發送非應答信號
			}
			else
			{
				*((volatile uint32 *)(&I2CONSET) + (I2C_n*0x10000)) = 1<<2;	//下次發送應答信號
			}
			*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = 0x28;		//清零SI,SLA	
			break;
		case	0x20:	/*已發送SLA+W,已接收非應答*/
		case	0x30:	/*已發送I2DAT中的數據,已接收非應答*/
		case	0x38:	/*在SLA+R/W或數據字節中丟失仲裁*/
		case	0x48:	/*已發送SLA+R,已接收非應答*/
			*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = 0x28;
			I2C_end = 0xff;	//總線出錯
			break;		
		case	0x50:	/*已接收數據字節,已返回ACK*/
			*I2C_buf++ = *((volatile uint32 *)(&I2DAT) + (I2C_n*0x10000));
			I2C_num--;
			if(I2C_num == 1)	/*接收最后一個字節*/
			{
				*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = 0x2c;	//STA,SI,AA=0
			}
			else
			{
				*((volatile uint32 *)(&I2CONSET) + (I2C_n*0x10000)) = 0x04;	//AA=1
				*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = 0x28;
			}
			break;
		case	0x58:	/*已接收數據字節,已返回非應答*/
			*I2C_buf++ = *((volatile uint32 *)(&I2DAT) + ((I2C_n*0x40000)/4));	//讀取最后一字節數據
			*((volatile uint32 *)(&I2CONSET) + (I2C_n*0x10000)) = 0x10;			//結束總線
			*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = 0x28;
			I2C_end = 1;			
			break;			
		/////////以下為從機模式所對應的狀態信息/////////
		case	0x60:	//接收到自身SLA+W
		case	0x68:
			slarv = 0;
			*((volatile uint32 *)(&I2CONSET) + (I2C_n*0x10000)) = 0x04;			
			*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = 0x38;	//清除I2C標志位,STA、STO、SI	
			break;
		case	0xa8:	//接收到SLA+R,或已經發送數據并接收到ACK位
		case	0xb0:
		case	0xb8:
			*((volatile uint32 *)(&I2DAT) + (I2C_n*0x10000)) = *(I2C_buf+adrpoint);	//將對應地址處的數據放入I2DAT中
			adrpoint++;
			*((volatile uint32 *)(&I2CONSET) + (I2C_n*0x10000)) = 0x04;
			*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = 0x38;	//清除I2C標志位,STA、STO、SI	
			break;
		case	0x80:	//接收到數據
			if(slarv==0)
			{
				adrpoint = *((volatile uint32 *)(&I2DAT) + (I2C_n*0x10000));
				slarv = 1;
			}
			else
			{				
				*(I2C_buf+adrpoint) = *((volatile uint32 *)(&I2DAT) + (I2C_n*0x10000));
				adrpoint++;				
			}
			*((volatile uint32 *)(&I2CONSET) + (I2C_n*0x10000)) = 0x04;			
			*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = 0x38;	//清除I2C標志位,STA、STO、SI	
			break;
		case	0xc0:	//總線結束,或總線重新啟動
		default:		//其它狀態
			*((volatile uint32 *)(&I2CONSET) + (I2C_n*0x10000)) = 0x04;				
			*((volatile uint32 *)(&I2CONCLR) + (I2C_n*0x10000)) = 0x38;	//清除I2C標志位,STA、STO、SI
			break;		
	}
	VICVectAddr = 0x00;				//中斷處理結束
}

/*********************************************************************************************************
**函數名稱:uint8  I2C_Init(uint8 n,uint8 MODE,uint32 Fi2c,uint8 Adr,uint8 slot)
**函數功能:初始化I2C接口
**入口參數:n		:I2C接口號,0--I2C0,1--I2C1
**          MODE	:工作模式,0--從模式,1--主模式
**			Fi2c	:I2C通信速率,0~400K,如果超過400K,則會強制設置為400KHz,如果設置為從機,該參數無效
**			Adr		:當設置為從模式時,Adr表示從地址,在主模式下,該參數是無效的,可以任意設置
**			slot	:由于I2C采用IRQ中斷方式,所以需要指定對應的通道,0~15
**出口參數:1--接口初始化成功,0--接口初始化失敗
********************************************************************************************************/

uint8  I2C_Init(uint8 n,uint8 MODE,uint32 Fi2c,uint8 Adr,uint8 slot)
{
	if(Fi2c > 400000)
	{
		Fi2c = 400000;				//強制將通信速率限制在0~400KHz的范圍內
	}
	if((n!=0)&&(n!=1))						
	{
		return(0);					//n只能為0  1
	}
	if((MODE!=0)&&(MODE!=1))				
	{	
		return(0);					//MODE只能為0  1	
	}
	if(slot>15)						
	{					
		return(0);				    //IRQ中斷號0~15
	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久人人97超碰com| 亚洲精品免费在线| 91一区二区在线观看| 日韩二区三区四区| 国产精品久久久久婷婷 | 91麻豆精品国产91久久久使用方法 | 欧美一区二区在线视频| 成人动漫中文字幕| 激情综合五月婷婷| 亚洲一区二区五区| 中文字幕制服丝袜一区二区三区| 日韩网站在线看片你懂的| 99精品久久只有精品| 精品一区二区三区免费毛片爱 | 亚洲欧洲无码一区二区三区| 51午夜精品国产| 欧美综合在线视频| 不卡一区二区三区四区| 国产成人午夜精品5599| 免费观看成人av| 天堂成人国产精品一区| 亚洲一区免费在线观看| 亚洲欧洲国产专区| 国产婷婷色一区二区三区四区 | 欧美一级黄色片| 欧美午夜一区二区| 91在线观看美女| 成人午夜激情在线| 国产成人精品午夜视频免费| 国内精品视频666| 久久精品理论片| 六月丁香综合在线视频| 青青草国产成人99久久| 日本在线不卡一区| 日产国产欧美视频一区精品| 亚洲成人综合视频| 午夜成人免费电影| 日韩福利视频网| 丝袜a∨在线一区二区三区不卡| 亚洲伦理在线免费看| 亚洲视频小说图片| 国产精品久久久久久福利一牛影视| 国产亚洲欧美色| 国产欧美日韩视频在线观看| 国产色婷婷亚洲99精品小说| 久久久蜜桃精品| 日本一区二区三区四区在线视频| 欧美国产亚洲另类动漫| 国产精品丝袜一区| 亚洲欧美另类久久久精品2019| 国产精品国产三级国产专播品爱网| 日本一区二区动态图| 亚洲国产高清在线| 亚洲蜜桃精久久久久久久| 亚洲日本在线a| 亚洲午夜电影在线| 日韩高清在线一区| 精品一区二区三区免费观看| 国产一区二区精品久久91| 成人午夜av在线| 色狠狠一区二区| 在线不卡一区二区| 欧美大片在线观看一区二区| 久久精品夜夜夜夜久久| 国产精品福利电影一区二区三区四区| 亚洲激情av在线| 日韩电影一区二区三区四区| 激情成人午夜视频| 成人av免费在线观看| 欧美日韩一级片在线观看| 精品久久久久久久久久久院品网| 欧美国产亚洲另类动漫| 亚洲永久免费视频| 免费观看30秒视频久久| 成人国产精品免费观看动漫| 欧美视频一区在线观看| 日韩免费观看高清完整版| 国产精品伦理在线| 亚洲成人av免费| 国产.欧美.日韩| 欧美日韩高清一区二区| 久久蜜臀精品av| 亚洲国产日韩在线一区模特 | www.久久精品| 欧美蜜桃一区二区三区| 国产亚洲欧美中文| 亚洲 欧美综合在线网络| 激情深爱一区二区| 色婷婷综合久久久中文一区二区| 69av一区二区三区| 国产精品久久影院| 免费成人av在线播放| 一本到不卡免费一区二区| 日韩精品一区二区三区四区 | 日韩高清在线一区| 99久久久无码国产精品| 日韩一区二区影院| 亚洲欧美日韩久久精品| 国产一区二区在线观看免费| 欧美在线一二三四区| 欧美国产日韩一二三区| 老司机午夜精品| 欧美午夜一区二区| 亚洲三级电影网站| 国产酒店精品激情| 日韩欧美一卡二卡| 亚洲精品网站在线观看| 国产成人免费av在线| 日韩一区二区免费在线观看| 日韩高清在线观看| 色综合一区二区三区| 久久精品欧美一区二区三区麻豆 | 国产一区不卡在线| 777奇米四色成人影色区| 亚洲三级在线免费观看| 成人免费毛片a| 久久人人97超碰com| 激情图片小说一区| 欧美成人午夜电影| 日韩av网站在线观看| 欧美性猛交xxxx乱大交退制版| 国产精品久久久久久久久免费樱桃| 国产综合成人久久大片91| 日韩网站在线看片你懂的| 日韩在线观看一区二区| 欧美色综合天天久久综合精品| 亚洲免费在线电影| 色婷婷av一区二区三区之一色屋| 一区精品在线播放| www.在线欧美| 国产精品传媒视频| 91免费精品国自产拍在线不卡| 国产精品天美传媒沈樵| 成人免费精品视频| 欧美国产欧美综合| av在线不卡网| 亚洲欧美日韩系列| 91官网在线观看| 一二三区精品视频| 在线观看欧美日本| 亚洲第一电影网| 日韩一级免费一区| 国模冰冰炮一区二区| 久久一日本道色综合| 国产99久久久久久免费看农村| 国产日产欧美一区| 97久久精品人人澡人人爽| 自拍偷拍亚洲激情| 在线视频一区二区三区| 亚洲不卡av一区二区三区| 欧美一区二区视频在线观看2020| 美女网站色91| 国产日韩欧美在线一区| 91精品国产丝袜白色高跟鞋| 日本在线播放一区二区三区| 久久综合成人精品亚洲另类欧美 | 国产成人一区在线| 综合中文字幕亚洲| 欧美亚洲一区三区| 青青草国产成人av片免费| 久久久亚洲午夜电影| 成人福利在线看| 午夜精品久久久久久久99水蜜桃 | 欧洲亚洲国产日韩| 蜜臀91精品一区二区三区| 久久久久久久久久久电影| av色综合久久天堂av综合| 亚洲午夜精品一区二区三区他趣| 日韩欧美黄色影院| www.激情成人| 日本aⅴ免费视频一区二区三区| 久久婷婷成人综合色| 91亚洲国产成人精品一区二三| 五月天亚洲精品| 国产日韩欧美一区二区三区乱码| 91在线丨porny丨国产| 日韩不卡免费视频| 国产精品你懂的| 欧美一级日韩不卡播放免费| 风流少妇一区二区| 日日夜夜精品免费视频| 欧美极品少妇xxxxⅹ高跟鞋| 欧美日韩一区在线| 国产a级毛片一区| 日本伊人精品一区二区三区观看方式| 国产三级精品视频| 欧美乱妇23p| 91玉足脚交白嫩脚丫在线播放| 日一区二区三区| 中文字幕一区二区三区在线播放| 91精品国产高清一区二区三区蜜臀| 国产盗摄一区二区| 日本成人中文字幕在线视频 | 中文幕一区二区三区久久蜜桃| 欧美日本免费一区二区三区| a美女胸又www黄视频久久| 蜜臀久久99精品久久久画质超高清| 综合久久综合久久| 久久美女艺术照精彩视频福利播放| 欧美婷婷六月丁香综合色|