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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? i2cint.c

?? ARM7通用串行口的開發(fā)程序
?? C
字號:
#define IN_I2C
#include "config.h"


static OS_EVENT     *I2C_Sem;
static OS_EVENT     *I2C_Mbox;
static volatile     uint8 	I2C_sla;			/* I2C器件從地址 					*/
static volatile     uint32	I2C_suba;			/* I2C器件內(nèi)部子地址 				*/
static volatile     uint8 	I2C_suba_num;		/* I2C子地址字節(jié)數(shù)					*/
static volatile     uint8   *I2C_buf;        	/* 數(shù)據(jù)緩沖區(qū)指針  					*/
static volatile     uint32  I2C_num;			/* 要讀取/寫入的數(shù)據(jù)個數(shù) 			*/
static volatile     uint8 	I2C_end;			/* I2C總線結(jié)束標(biāo)志:結(jié)束總線是置1 	*/
static volatile     uint8 	I2C_suba_en;		/* 子地址控制。
										           0--子地址已經(jīng)處理或者不需要子地址
										           1--讀取操作
										           2--寫操作
									            */
									
#define I2C_WRITE_END       1           /* 寫完成   */
#define I2C_READ_END        2           /* 讀完成   */
#define I2C_NOT_GET_BUS     4           /* 丟失仲裁 */
#define I2C_ACK_ERR         8           /* 接收ACK錯誤 */

//uint8 I2C_Buf[256];


uint8 I2C_Init(uint32 Fi2c)
{
    VICIntEnClr = 1 << 9;                               // 禁止能I2C_中斷 
    if (Fi2c <= 400000)
    {
        PINSEL0 = (PINSEL0 & 0xffffff0f) | 0x50;        // 選擇管腳為I2C
        I2CONCLR = 0x6C;                                // 清除控制寄存器
        I2SCLH = (Fpclk / Fi2c + 1) / 2;                // 設(shè)置高電平時間
        I2SCLL = (Fpclk / Fi2c) / 2;                    // 設(shè)置低電平時間
        I2C_Sem = OSSemCreate(1);                       // 信號量用于互斥操作總線 
        I2C_Mbox = OSMboxCreate(NULL);                  // 消息郵箱用于中斷向任務(wù)傳遞操作結(jié)果
        if (I2C_Mbox == NULL)
        {
            return FALSE;
        }
        if (I2C_Sem != NULL)
        {
            return TRUE;
        }
    }
    return FALSE;
}


uint8  I2C_ISendByte(uint8 sla, uint8 dat)
{   uint8 err;
 
    OSSemPend(I2C_Sem, 0, &err);
    
    I2C_sla     = sla;		    // 寫操作的器件地址
    I2C_buf     = &dat;		    // 待發(fā)送的數(shù)據(jù)
    I2C_num     = 1;			// 發(fā)送1字節(jié)數(shù)據(jù)
    I2C_suba_en = 0;		 	// 無子地址
    I2C_end     = 0;
   
    I2CONCLR = 0x2C;
    I2CONSET = 0x60;            // 設(shè)置為主機,并啟動總線
   
    while(0 == I2C_end);
    if(1 == I2C_end) 
    {
        OSSemPost(I2C_Sem);
        return TRUE;
    }
    else 
    {
        OSSemPost(I2C_Sem);
        return FALSE;
    }
}

uint8  I2C_IRcvByte(uint8 sla, uint8 *dat)
{   uint8 err;

    OSSemPend(I2C_Sem, 0, &err);
    
    I2C_sla     = sla+1;        // 讀操作的器件地址
    I2C_buf     = dat;
    I2C_num     = 1;
    I2C_suba_en = 0;            // 無子地址
    I2C_end     = 0;
   
    I2CONCLR = 0x2C;
    I2CONSET = 0x60;            // 設(shè)置為主機,并啟動總線
   
    while(0 == I2C_end);
    if(1 == I2C_end) 
    {
        OSSemPost(I2C_Sem);
        return TRUE;
    }
    else 
    {
        OSSemPost(I2C_Sem);
        return FALSE;
    }
}



uint8 I2C_ReadNByte (uint8 sla, uint32 suba_type, uint32 suba, uint8 *s, uint32 num)
{   uint8 err;

	if (num > 0)	/* 判斷num個數(shù)的合法性 */
	{	/* 參數(shù)設(shè)置 */
        OSSemPend(I2C_Sem, 0, &err);
	
		if (suba_type == 1)
		{	/* 子地址為單字節(jié) */
			I2C_sla     	= sla + 1;							/* 讀器件的從地址,R=1 	*/
			I2C_suba    	= suba;								/* 器件子地址 			*/
			I2C_suba_num	= 1;								/* 器件子地址為1字節(jié) 	*/
		}
		if (suba_type == 2)
		{	/* 子地址為2字節(jié) */
			I2C_sla     	= sla + 1;							/* 讀器件的從地址,R=1 	*/
			I2C_suba   	 	= suba;								/* 器件子地址 			*/
			I2C_suba_num	= 2;								/* 器件子地址為2字節(jié) 	*/
		}
		if (suba_type == 3)
		{	/* 子地址結(jié)構(gòu)為8+X*/
			I2C_sla			= sla + ((suba >> 7 )& 0x0e) + 1;	/* 讀器件的從地址,R=1	*/
			I2C_suba		= suba & 0x0ff;						/* 器件子地址	 		*/
			I2C_suba_num	= 1;								/* 器件子地址為8+x	 	*/
		}
		I2C_buf     = s;										/* 數(shù)據(jù)接收緩沖區(qū)指針 	*/
		I2C_num     = num;										/* 要讀取的個數(shù) 		*/
		I2C_suba_en = 1;										/* 有子地址讀 			*/
		I2C_end     = 0;
		

        I2CONCLR = (1 << 6)|                                // 清除控制寄存器
                   (1 << 5)|
                   (1 << 3)|
                   (1 << 2);
                   
        I2CONSET = (1 << 6)|                                // 設(shè)置為主模式,啟動總線
                   (1 << 5)|
                   (1 << 2);
        VICIntEnable = 1 << 9;
        
        OSMboxPend(I2C_Mbox, 0, &err);	
        
        VICIntEnClr = 1 << 9;
        
        OSSemPost(I2C_Sem);
        return TRUE;
	}
    else 
    {
        return FALSE;
    }
}


uint8 I2C_WriteNByte(uint8 sla, uint8 suba_type, uint32 suba, uint8 *s, uint32 num)
{   uint8 err;
    
	if (num > 0)/* 如果讀取的個數(shù)為0,則返回錯誤 */
	{   OSSemPend(I2C_Sem, 0, &err);
	
		if (suba_type == 1)
		{	/* 子地址為單字節(jié) */
			I2C_sla     	= sla;								/* 讀器件的從地址	 	*/
			I2C_suba    	= suba;								/* 器件子地址 			*/
			I2C_suba_num	= 1;								/* 器件子地址為1字節(jié) 	*/
		}
		if (suba_type == 2)
		{	/* 子地址為2字節(jié) */
			I2C_sla     	= sla;								/* 讀器件的從地址 		*/
			I2C_suba   	 	= suba;								/* 器件子地址 			*/
			I2C_suba_num	= 2;								/* 器件子地址為2字節(jié) 	*/
		}
		if (suba_type == 3)
		{	/* 子地址結(jié)構(gòu)為8+X */
			I2C_sla			= sla + ((suba >> 7 )& 0x0e);		/* 讀器件的從地址		*/
			I2C_suba		= suba & 0x0ff;						/* 器件子地址			*/
			I2C_suba_num	= 1;								/* 器件子地址為8+X	 	*/
		}

		I2C_buf     = s;										/* 數(shù)據(jù) 				*/
		I2C_num     = num;										/* 數(shù)據(jù)個數(shù) 			*/
		I2C_suba_en = 2;										/* 有子地址,寫操作 	*/
		I2C_end     = 0;
		
		I2CONCLR = (1 << 6)|                                // 清除控制寄存器
                   (1 << 5)|
                   (1 << 3)|
                   (1 << 2);
                   
        I2CONSET = (1 << 6)|                                // 設(shè)置為主模式,啟動總線
                   (1 << 5)|
                   (1 << 2);
        VICIntEnable = 1 << 9;
        
        OSMboxPend(I2C_Mbox, 0, &err);	
        
        VICIntEnClr = 1 << 9;
        
        OSSemPost(I2C_Sem);
        return TRUE;
	}
    else 
    {
        return FALSE;
    }
}




void I2C_Exception(void)
{
    OS_ENTER_CRITICAL();

    switch (I2STAT & 0xf8)
	{	// I2C總線已啟動,準(zhǔn)備發(fā)送從地址。
        case 0x08:
		 	if(I2C_suba_en == 1)                        // 指定子地址讀
		 	{	
		 	    I2DAT = I2C_sla & 0xfe;                 // 先寫入地址
		 	}
            else
            {  	
                I2DAT = I2C_sla;                 // 否則直接發(fā)送從機地址
            }
            I2CONSET = (1 << 2);                        // AA  = 1 
            I2CONCLR = (1 << 3);                        // SI  = 0
            break;
            
        // 已發(fā)送重復(fù)起始條件   
       	case 0x10:	
       		I2DAT = I2C_sla;							// 重起總線后,重發(fā)從地址
            I2CONSET = (1 << 2);                        // AA  = 1 
            I2CONCLR = (1 << 3);                        // SI  = 0
       		break;
       		
        // 已發(fā)送I2DAT中的數(shù)據(jù),已接收ACK
		case 0x18:
       	case 0x28:	
       	    // 若是無子地址讀
       		if (I2C_suba_en == 0)                       // 若是指定地址讀,則重新啟動總線
       		{
	       		if (I2C_num > 0)
	       		{	
	       		    I2DAT = *I2C_buf++;
                    I2CONSET = (1 << 2);                // AA  = 1 
                    I2CONCLR = (1 << 3);                // SI  = 0 		
	       			I2C_num--;
	       		}
	       		// 沒有數(shù)據(jù)發(fā)送,則發(fā)送停止總線標(biāo)志
	       		else	                                
	       		{		                               
	       		    I2CONSET = (1 << 2)|                // AA  = 1 
	       		               (1 << 4);                // STO = 1
                    I2CONCLR = (1 << 3);                // SI  = 0
	       		  	I2C_end = 1;						// 指示總線停止
	       		  	OSMboxPost(I2C_Mbox, (void *)I2C_WRITE_END);
	       		    VICIntEnClr = 1 << 9;
	       		}
       		}
       		// 若是指定子地址讀,則重新啟動總線
            if(I2C_suba_en == 1)
            { 
            	if (I2C_suba_num == 2)
            	{
            	    I2DAT = ((I2C_suba >> 8) & 0xff);
	       			I2CONSET = (1 << 2);                // AA  = 1 
                    I2CONCLR = (1 << 3)|                // SI  = 0
                               (1 << 5);                // STA = 0
	       			I2C_suba_num--;
	       			break;	
	       		} 
	       		
	       		if(I2C_suba_num == 1)
	       		{	
	       		    I2DAT = (I2C_suba & 0xff);
	       			I2CONSET = (1 << 2);                // AA  = 1 
                    I2CONCLR = (1 << 3)|                // SI  = 0
                               (1 << 5);                // STA = 0
	       			I2C_suba_num--;
	       			break;	
	       		}
	       		
            	if (I2C_suba_num == 0)
            	{	
                    I2CONSET = (1 << 5);                // STA = 1
                    I2CONCLR = (1 << 3);                // SI  = 0
               		I2C_suba_en = 0;  
               		break;
               	}
            }
            // 指定子地址寫,子地址尚未指定,則發(fā)送子地址
            if (I2C_suba_en == 2)
       		{
       		 	if (I2C_suba_num > 0)
            	{	if (I2C_suba_num == 2)
            		{	
            		    I2DAT = ((I2C_suba >> 8) & 0xff);
	       			    I2CONSET = (1 << 2);            // AA  = 1 
                        I2CONCLR = (1 << 3)|            // SI  = 0
                                   (1 << 5);            // STA = 0
            			I2C_suba_num--;
            			break;
            		}
            		if (I2C_suba_num == 1)
            		{	
            		    I2DAT    = (I2C_suba & 0xff);
            		    I2CONSET = (1 << 2);            // AA  = 1 
                        I2CONCLR = (1 << 3)|            // SI  = 0
                                   (1 << 5);            // STA = 0
               			I2C_suba_num--;
               			I2C_suba_en  = 0;
               			break;
               		}
               	}
             }
       		break;
       		
       		
        // 已發(fā)送SLA+R;已接收ACK
       case 0x40:	
       		if (I2C_num <= 1)		
       		{	
       		    I2CONCLR = (1 << 2);                    // AA  = 0 
       		}
       		else
       		{ 	
       		    I2CONSET = (1 << 2);                    // AA  = 1 
       		}
            I2CONCLR = (1 << 3)|                        // SI  = 0
                       (1 << 5);                        // STA = 0   不能刪除,因為STA不能自動清除
       		break;
       		
       		
        // 總線發(fā)生異常
       	case 0x20:	// 已發(fā)送SLA+W,已接收非應(yīng)答
       	case 0x30:	// 已發(fā)送I2DAT中的數(shù)據(jù),已接收非應(yīng)答
       	case 0x38:	// 在SLA+R/W或數(shù)據(jù)字節(jié)中丟失仲裁
   		case 0x48:	// 已發(fā)送SLA+R,已接收非應(yīng)答
	        I2CONSET = (1 << 2)|                        // AA  = 1 
                       (1 << 4);                        // STO = 1
            I2CONCLR = (1 << 3);                        // SI  = 0
            I2C_end = 0xff;                             // 異常,總線停止
            OSMboxPost(I2C_Mbox, (void *)I2C_ACK_ERR);
            VICIntEnClr = 1 << 9;
       		break;   				
	
	
        // 已接收數(shù)據(jù)字節(jié),已返回ACK
		case 0x50:	
			*I2C_buf++ = I2DAT;
			I2C_num--;
			if (I2C_num == 1)                           // 接收最后一個字節(jié)
			{  	
			    I2CONCLR = (1 << 2)|                    // AA  = 0
                           (1 << 3);                    // SI  = 0
			}
			else
			{  	 
			    I2CONSET = (1 << 2);                    // AA  = 1 
                I2CONCLR = (1 << 3);                    // SI  = 0
			}
			break;
			
			
        // 已接收數(shù)據(jù)字節(jié),已返回非應(yīng)答
		case 0x58:	
			*I2C_buf++ = I2DAT;                         // 讀取最后一字節(jié)數(shù)據(jù)
	        I2CONSET = (1 << 2)|                        // AA  = 1 
                       (1 << 4);                        // STO = 1
            I2CONCLR = (1 << 3);                        // SI  = 0
            I2C_end = 1; 
            OSMboxPost(I2C_Mbox, (void *)I2C_READ_END);
            VICIntEnClr = 1 << 9;
            break;
            
      	default:
            //I2CONCLR = 0x28;                            // 清除標(biāo)志
      		break;
	}
    VICVectAddr = 0x00;		

    OS_EXIT_CRITICAL();
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91在线免费视频观看| 不卡一区二区在线| 国产九色sp调教91| 日本久久电影网| 欧美va日韩va| 樱花影视一区二区| 精品亚洲成a人| 欧美专区日韩专区| 国产无一区二区| 亚洲第一狼人社区| 国产99一区视频免费| 欧美人狂配大交3d怪物一区| 日本一区二区三区在线不卡 | 日韩一区二区三区观看| 1024成人网色www| 国内外成人在线| 欧美中文字幕久久| 亚洲国产岛国毛片在线| 久久99热99| 6080yy午夜一二三区久久| 中文字幕在线观看不卡视频| 韩国女主播成人在线| 91精品国产91久久久久久最新毛片 | 日韩三级免费观看| 一区二区三区免费| 成人免费视频app| 国产日韩欧美不卡| 激情综合色丁香一区二区| 欧美中文一区二区三区| 亚洲欧美成aⅴ人在线观看| 国产91在线观看丝袜| 精品国偷自产国产一区| 日本不卡视频在线| 91精品午夜视频| 亚洲午夜私人影院| 91啪九色porn原创视频在线观看| 欧美经典一区二区| 懂色av一区二区三区免费看| 国产婷婷色一区二区三区| 激情文学综合网| 久久久99精品免费观看| 国产高清一区日本| 国产精品视频yy9299一区| 国产91综合一区在线观看| 久久嫩草精品久久久精品一| 久久99在线观看| 日韩精品中文字幕一区二区三区| 日韩经典一区二区| 欧美一区二区久久久| 亚洲一二三四区不卡| 欧美日韩中文国产| 天堂成人国产精品一区| 在线观看91精品国产麻豆| 日韩在线卡一卡二| 8x8x8国产精品| 国产一区二区三区电影在线观看 | 国产日韩亚洲欧美综合| 国产99久久久精品| 亚洲久草在线视频| 欧美日韩国产精选| 国产一区二区视频在线播放| 国产精品久久久久一区二区三区共 | 国产一区二区三区精品视频| 国产免费观看久久| 欧美在线播放高清精品| 麻豆国产欧美一区二区三区| 国产三级久久久| 欧美主播一区二区三区美女| 精品一区二区免费视频| 国产精品美女久久久久久久| 欧美日韩精品一区二区三区蜜桃| 黑人巨大精品欧美一区| 中文字幕一区二区三| 日韩一区二区三区在线观看| 成人一区二区三区在线观看| 亚洲午夜免费电影| 精品国产乱码久久久久久夜甘婷婷| 高清shemale亚洲人妖| 一级特黄大欧美久久久| 欧美一区在线视频| 成人v精品蜜桃久久一区| 性欧美疯狂xxxxbbbb| 欧美极品少妇xxxxⅹ高跟鞋 | 久久精品亚洲乱码伦伦中文| 国产91精品在线观看| 亚洲一区二区中文在线| 欧美一二区视频| 一本一道久久a久久精品综合蜜臀| 天天综合网天天综合色| 国产精品热久久久久夜色精品三区 | 麻豆免费看一区二区三区| 亚洲国产精品国自产拍av| 欧美日韩国产成人在线免费| 国产成人av电影在线观看| 日韩成人伦理电影在线观看| 亚洲欧美一区二区三区极速播放| 欧美一区二区三区小说| 色偷偷久久人人79超碰人人澡| 黄网站免费久久| 视频一区视频二区中文| 亚洲三级在线免费观看| www久久精品| 制服丝袜亚洲播放| 欧美中文字幕亚洲一区二区va在线| 国产电影一区二区三区| 精品无人码麻豆乱码1区2区| 日韩主播视频在线| 亚洲一区二区三区三| 亚洲人成电影网站色mp4| 国产精品美女久久久久高潮| 国产午夜精品一区二区三区嫩草 | 国产色产综合色产在线视频| 日韩一区二区在线看片| 欧美乱妇15p| 欧美午夜电影网| 91视频观看视频| 成人免费精品视频| 国产高清精品在线| 国产精品99久久久久久久vr| 精品一区二区三区在线播放| 免费av网站大全久久| 日韩不卡一区二区| 日本不卡一区二区| 日韩精彩视频在线观看| 日韩专区在线视频| 日本午夜精品一区二区三区电影| 性感美女极品91精品| 五月天中文字幕一区二区| 午夜久久久影院| 日本欧美久久久久免费播放网| 日本系列欧美系列| 黑人精品欧美一区二区蜜桃| 国产激情偷乱视频一区二区三区 | 亚洲成人第一页| 日本欧美在线看| 日本亚洲三级在线| 国产又粗又猛又爽又黄91精品| 国产丶欧美丶日本不卡视频| 成av人片一区二区| 欧美午夜精品一区二区蜜桃| 欧美一级视频精品观看| 久久人人爽人人爽| 亚洲摸摸操操av| 午夜精品福利一区二区三区蜜桃| 蜜桃一区二区三区在线| 国产乱码精品1区2区3区| 波波电影院一区二区三区| 在线免费一区三区| 精品少妇一区二区三区在线视频| 国产精品视频观看| 午夜成人在线视频| 国产成人精品影院| 91免费视频网址| 欧美一卡二卡三卡| 国产精品天美传媒| 亚洲国产精品久久不卡毛片| 青青草成人在线观看| 波多野结衣一区二区三区| 欧美日产在线观看| 久久久久久97三级| 久久精品久久综合| 色域天天综合网| 日韩一区二区三区视频在线观看| 中日韩av电影| 免费视频一区二区| 99久久久精品| 2020国产精品自拍| 午夜精品福利久久久| 懂色av一区二区三区免费观看| 7777精品伊人久久久大香线蕉| 欧美国产精品一区| 人人超碰91尤物精品国产| 91麻豆精东视频| 久久美女艺术照精彩视频福利播放| 亚洲精品中文字幕在线观看| 国产盗摄视频一区二区三区| 91精品婷婷国产综合久久性色| 国产精品电影一区二区| 精品一区二区精品| 欧美日韩一本到| 亚洲乱码国产乱码精品精98午夜 | 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 亚洲精品一区二区三区福利| 午夜欧美一区二区三区在线播放| 国产91露脸合集magnet| 欧美电影免费观看高清完整版在 | 国产高清成人在线| 日韩欧美国产精品一区| 亚洲高清免费在线| 色婷婷av一区二区三区之一色屋| 欧美国产一区二区| 国产乱码精品一区二区三区忘忧草 | 国产欧美日韩卡一| 日韩精品五月天| 欧美视频精品在线| 日韩一区在线免费观看| 国产成人精品一区二区三区四区 | 欧美精品一级二级三级| 亚洲自拍偷拍图区| 色94色欧美sute亚洲线路一久|