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

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

?? smb_test0.c

?? c8051f020 i2c 的簡單應用
?? C
字號:
// C8051F020 通過SMBus 與三個EEPROM 接口的示例代碼。
// 該程序假設三個具有16 位地址空間的EEPROM 連在SCL 和SDA 線上,
// 被配置為具有如下從地址:
// CHIP_A = 1010000
// CHIP_B = 1010001
// CHIP_C = 1010010
// 從狀態和競爭狀態沒有定義。假設C8051F020 為系統中唯一的主器件。
// 功能:SM_Send 執行向指定EEPROM 的單字節寫操作
// SM_Receive 執行從指定EEPROM 地址讀一個字節的操作(兩者都用到存儲器地址)
//
// 包含測試代碼部分。
//--------------------------------------------------------------------
// 包含文件
//--------------------------------------------------------------------
#include <c8051f020.h> // SFR 聲明
//--------------------------------------------------------------------
// 全局常量
//--------------------------------------------------------------------
#define WRITE 0x00 		// SMBus 寫命令
#define READ 0x01 		// SMBus 讀命令
						// 器件地址(7 位,最低位沒使用)
#define CHIP_A 0xA0 	// 芯片A 的器件地址
#define CHIP_B 0xA2 	// 芯片B 的器件地址
#define CHIP_C 0xA4 	// 芯片C 的器件地址
			// SMBus 狀態
			// MT = 主發送器
			// MR = 主接收器
#define SMB_BUS_ERROR 0x00 		// (對所有方式)總線錯誤
#define SMB_START 0x08 			// (MT & MR)起始條件已發送
#define SMB_RP_START 0x10 		// (MT & MR)重復起始條件
#define SMB_MTADDACK 0x18 		// (MT) 從地址+ W 已發送;收到ACK
#define SMB_MTADDNACK 0x20 		// (MT) 從地址+ W 已發送;收到NACK
#define SMB_MTDBACK 0x28 		// (MT) 數據字節已發送;收到ACK
#define SMB_MTDBNACK 0x30 		// (MT) 數據字節已發送;收到NACK
#define SMB_MTARBLOST 0x38 		// (MT) 競爭失敗
#define SMB_MRADDACK 0x40 		// (MR) 從地址+ R 已發送;收到ACK
#define SMB_MRADDNACK 0x48 		// (MR) 從地址+ W 已發送;收到NACK
#define SMB_MRDBACK 0x50 		// (MR) 收到數據字節;ACK 已發送
#define SMB_MRDBNACK 0x58 		// (MR) 收到數據字節;NACK 已發送
//--------------------------------------------------------------------
//全局變量
//--------------------------------------------------------------------
char COMMAND; 		// 在SMBus 中斷服務程序中用于
					// 保存從地址+ R/W 位。
char WORD; 			// 保持SMBus 要發送的數據字節
					// 或剛收到的數據
char BYTE_NUMBER; 	// 在中用于檢查發送的是什么數據
					// 高地址字節、低地址字節或數據字節
unsigned char HIGH_ADD, LOW_ADD; 	// EEPROM 存儲器地址的高、低字節
bit SM_BUSY; 		// 該位在發送或接收開始時被置1,
					// 操作結束后由中斷服務程序清0
//--------------------------------------------------------------------
// 函數原型
//--------------------------------------------------------------------
void SMBus_ISR (void);
void SM_Send (char chip_select, unsigned int byte_address, char out_byte);
char SM_Receive (char chip_select, unsigned int byte_address);
//--------------------------------------------------------------------
// 主程序
//--------------------------------------------------------------------
//
// 主程序配置交叉開關和SMBus,并測試SMBus 與三個EEPROM 之間的接口
void main (void)
{
	unsigned char check; 		// 用于測試目的
	WDTCN = 0xde; 				// 禁止看門狗定時器
	WDTCN = 0xad;
	OSCICN |= 0x03; 			// 設置內部振蕩器為最高頻率(16 MHz)
	XBR0 = 0x01; 				// 通過交叉開關將SMBus 連到通用I/O 引腳;P0.0,P0.1
	XBR2 = 0x40; 				// 允許交叉開關和弱上拉
	SMB0CN = 0x44; 				// 允許SMBus 在應答周期發送ACK
	SMB0CR = -80; 				// SMBus 時鐘頻率= 100kHz.
	EIE1 |= 2; 					// SMBus 中斷允許
	EA = 1; 					// 全局中斷允許
	SM_BUSY = 0; 				// 為第一次傳輸釋放SMBus。
// 測試代碼-------------------------------------------------------------
	SM_Send(CHIP_A, 0x0088, 0x53); 		//發送0x53(數據)到CHIP_A 的地址0x88
	SM_Send(CHIP_B, 0x0001, 0x66); 		//發送0x66(數據)到CHIP_B 的地址0x01
	SM_Send(CHIP_C, 0x0010, 0x77);
	SM_Send(CHIP_B, 0x0333, 0xF0);
	SM_Send(CHIP_A, 0x0242, 0xF0);
	check = SM_Receive(CHIP_A, 0x0088); // 讀CHIP_A 的地址0x88
	check = SM_Receive(CHIP_B, 0x0001); // 讀CHIP_B 的地址0x01
	check = SM_Receive(CHIP_C, 0x0010);
	check = SM_Receive(CHIP_B, 0x0333);
	check = SM_Receive(CHIP_A, 0x0242);
// 代碼結束----------------------------------------------------------
}
// SMBus 字節寫函數-----------------------------------------------------
// 向給定存儲器地址寫一個字節
// out_byte = 待寫數據
// byte_address = 待寫存儲器地址(2 字節)
// chip_select = 待寫EEPROM 芯片的器件地址
void SM_Send (char chip_select, unsigned int byte_address, char out_byte)
{
	while (SM_BUSY); 					// 等待SMBus 空閑
	SM_BUSY = 1; 						// 占用SMBus(設置為忙)
	SMB0CN = 0x44; 						// SMBus 允許,應答周期發ACK
	BYTE_NUMBER = 2; 					// 2 地址字節
	COMMAND = (chip_select | WRITE); 	// 片選+ WRITE
	HIGH_ADD = ((byte_address >> 8) & 0x00FF); // 高8 位地址
	LOW_ADD = (byte_address & 0x00FF); 	// 低8 位地址
	WORD = out_byte; 					// 待寫數據
	STA = 1; 							// 啟動傳輸過程
}
// SMBus 隨機讀函數-----------------------------------------------------
// 從給定存儲器地址讀一個字節
// byte_address = 要讀取的存儲器地址
// chip_select = 待讀EEPROM 的器件地址
char SM_Receive (char chip_select, unsigned int byte_address)
{
	while (SM_BUSY); 					// 等待總線空閑
	SM_BUSY = 1; 						//占用SMBus(設置為忙)
	SMB0CN = 0x44; 						// 允許SMBus,應答周期發ACK
	BYTE_NUMBER = 2; 					// 2 地址字節
	COMMAND = (chip_select | READ); 	// 片選+ READ
	HIGH_ADD = ((byte_address >> 8) & 0x00FF); // 高8 位地址
	LOW_ADD = (byte_address & 0x00FF); 	// 低8 位地址
	STA = 1; 							// 啟動傳輸過程
	while (SM_BUSY); 					// 等待傳輸結束
	return WORD;
}
//--------------------------------------------------------------------
// 中斷服務程序
//--------------------------------------------------------------------
// SMBus 中斷服務程序
void SMBUS_ISR (void) interrupt 7
{
	switch (SMB0STA){ 					// SMBus 狀態碼(SMB0STA 寄存器)
// 主發送器/接收器:起始條件已發送
// 在該狀態發送的COMMAND 字的R/W 位總是為0(W),
// 因為對于讀和寫操作來說都必須先寫存儲器地址。
	case SMB_START:
	SMB0DAT = (COMMAND & 0xFE); 		// 裝入要訪問的從器件的地址
	STA = 0; 							// 手動清除START 位
	break;
//主發送器/接收器:重復起始條件已發送。
// 該狀態只應在讀操作期間出現,在存儲器地址已發送并得到確認之后
	case SMB_RP_START:
	SMB0DAT = COMMAND; 					// COMMAND 中應保持從地址+ R.
	STA = 0;
	break;
// 主發送器:從地址+ WRITE 已發送,收到ACK。
	case SMB_MTADDACK:
	SMB0DAT = HIGH_ADD; 				// 裝入待寫存儲器地址的高字節
	break;
// 主發送器:從地址+ WRITE 已發送,收到NACK。
// 從器件不應答,發送STOP + START 重試
	case SMB_MTADDNACK:
	STO = 1;
	STA = 1;
	break;
// 主發送器:數據字節已發送,收到ACK。
// 該狀態在寫和讀操作中都要用到。BYTE_NUMBER 看存儲器地址狀態– 如果
// 只發送了HIGH_ADD,則裝入LOW_ADD。如果LOW_ADD 已發送,檢查COMMAND
// 中的R/W 值以決定下一狀態。
	case SMB_MTDBACK:
	switch (BYTE_NUMBER){
		case 2: 					// 如果BYTE_NUMBER=2,
		SMB0DAT = LOW_ADD; 			// 只發送了HIGH_ADD。
		BYTE_NUMBER--; 				// 減1,為下一輪作準備
		break;
		case 1: 					// 如果BYTE_NUMBER=1,LOW_ADD 已發送。
		if (COMMAND & 0x01) 		// 如果R/W=READ,發送重復起始條件
		STA = 1;
		else{
		SMB0DAT = WORD; 			// 如果R/W=WRITE,裝入待寫字節
		BYTE_NUMBER--;}
		break;
		default: 					// 如果BYTE_NUMBER=0,傳輸結束
		STO = 1;
		SM_BUSY = 0; 				// 釋放SMBus
		}
		break;
// 主發送器:數據字節已發送,收到NACK。
// 從器件不應答,發送STOP + START 重試
	case SMB_MTDBNACK:
	STO = 1;
	STA = 1;
	break;
// 主發送器:競爭失敗
// 不應出現。如果出現,重新開始傳輸過程
	case SMB_MTARBLOST:
	STO = 1;
	STA = 1;
	break;
// 主接收器:從地址+ READ 已發送。收到ACK。
// 設置為在下一次傳輸后發送NACK,因為那將是最后一個字節(唯一)。
	case SMB_MRADDACK:
	AA = 0; 						// 在應答周期NACK。
	break;
// 主接收器:從地址+ READ 已發送。收到NACK。
// 從器件不應答,發送重復起始條件重試
	case SMB_MRADDNACK:
	STA = 1;
	break;
// 收到數據字節。ACK 已發送。
// 該狀態不應出現,因為AA 已在前一狀態被清0。如果出現,發送停止條件。
	case SMB_MRDBACK:
	STO = 1;
	SM_BUSY = 0;
	break;
// 收到數據字節。NACK 已發送。
// 讀操作已完成。讀數據寄存器后發送停止條件。
	case SMB_MRDBNACK:
	WORD = SMB0DAT;
	STO = 1;
	SM_BUSY = 0; 					// 釋放SMBus
	break;
// 在本應用中,所有其它狀態碼沒有意義。通信復位。
	default:
	STO = 1; 						// 通信復位。
	SM_BUSY = 0;
	break;
	}
SI=0; 								// 清除中斷標志
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产91在线|亚洲| 在线视频观看一区| 亚洲一区二区三区视频在线| 精品sm捆绑视频| 欧美视频一二三区| 国产剧情一区二区三区| 亚洲va中文字幕| 国产精品久久久久精k8| 精品国产一区二区三区不卡| 欧美私模裸体表演在线观看| 成人动漫在线一区| 精品一区二区三区免费播放| 亚洲成人7777| 亚洲精品免费一二三区| 中文字幕不卡的av| 欧美精品一区二区三区一线天视频| 色婷婷亚洲精品| 成人av资源网站| 韩国中文字幕2020精品| 五月天亚洲婷婷| 亚洲蜜臀av乱码久久精品 | 色婷婷久久久亚洲一区二区三区| 精品一区二区影视| 日韩精品1区2区3区| 亚洲地区一二三色| 亚洲一区二区五区| 伊人色综合久久天天人手人婷| 国产免费成人在线视频| 久久这里只精品最新地址| 在线播放日韩导航| 欧美日韩精品专区| 欧美日韩大陆在线| 欧美视频一区二区三区四区| 在线精品视频小说1| 91在线观看下载| 国产69精品一区二区亚洲孕妇| 精品一区二区三区在线观看| 美国毛片一区二区| 老司机精品视频导航| 久久国产人妖系列| 久久成人18免费观看| 久久99最新地址| 久久精品国产精品青草| 韩国女主播一区| 国产精品中文有码| 粉嫩av一区二区三区粉嫩| 丁香一区二区三区| caoporn国产精品| 99re这里都是精品| 色婷婷亚洲一区二区三区| 色94色欧美sute亚洲线路一久| 91丨porny丨首页| 91福利在线播放| 欧美人与禽zozo性伦| 5566中文字幕一区二区电影 | 国产精品视频看| 国产精品久久久久aaaa樱花| 亚洲日本一区二区三区| 亚洲一区二区三区三| 日韩高清不卡一区| 激情都市一区二区| 99国产麻豆精品| 91国在线观看| 日韩免费看的电影| 欧美激情中文字幕一区二区| 国产精品国产a| 亚洲一二三区在线观看| 男女男精品网站| 国产福利一区在线观看| 91视频观看视频| 欧美伦理视频网站| 26uuu亚洲| 亚洲人成电影网站色mp4| 无码av免费一区二区三区试看| 经典三级一区二区| 成人少妇影院yyyy| 欧美色区777第一页| 精品国产乱码91久久久久久网站| 中文字幕国产精品一区二区| 亚洲国产日韩在线一区模特| 国产一区免费电影| 91黄色免费版| 久久久久国产免费免费| 亚洲精品乱码久久久久久| 久久国产综合精品| 色婷婷久久久久swag精品| 日韩精品一区二区三区视频在线观看| 中文成人av在线| 日韩成人精品在线观看| 99久久er热在这里只有精品15| 欧美一区二区精品在线| 日韩美女精品在线| 国产在线麻豆精品观看| 欧洲av一区二区嗯嗯嗯啊| 久久久久国色av免费看影院| 午夜在线电影亚洲一区| 99久久亚洲一区二区三区青草| 在线不卡的av| 一区二区在线观看免费视频播放| 久久精工是国产品牌吗| 欧美亚洲国产bt| 国产区在线观看成人精品| 日韩国产精品久久久| 色综合欧美在线| 久久久久久久电影| 蜜臀av一区二区在线观看 | 欧美日韩一区二区三区视频 | 国产精品久线在线观看| 久久成人精品无人区| 欧美日韩国产123区| 亚洲图片你懂的| 国产成人在线免费| 日韩欧美一区在线| 亚洲国产精品精华液网站| av在线这里只有精品| 久久久久久久久99精品| 免费一区二区视频| 欧美二区三区91| 亚洲成av人片观看| 欧美系列日韩一区| 亚洲精品国产a久久久久久| 成人免费福利片| 中文字幕精品一区二区精品绿巨人| 蜜桃av一区二区三区电影| 欧美区视频在线观看| 一区二区三区在线影院| 91浏览器在线视频| 中文字幕一区视频| 大胆欧美人体老妇| 久久久九九九九| 麻豆精品视频在线观看免费| 在线综合视频播放| 午夜欧美视频在线观看| 欧美午夜精品一区| 一区二区三区在线观看网站| 91丨porny丨蝌蚪视频| 成人欧美一区二区三区白人| 成人av资源站| 国产精品天干天干在观线| 粉嫩一区二区三区性色av| 国产亚洲欧美中文| 成人性生交大片免费| 国产精品的网站| 一本一本大道香蕉久在线精品| 国产精品成人一区二区三区夜夜夜| 成人免费毛片a| 亚洲人成在线播放网站岛国| 色丁香久综合在线久综合在线观看| 自拍av一区二区三区| 91高清在线观看| 亚洲国产va精品久久久不卡综合 | 99久久er热在这里只有精品15| 最新日韩av在线| 在线观看亚洲一区| 婷婷久久综合九色综合绿巨人| 欧美调教femdomvk| 蜜臀av性久久久久蜜臀av麻豆 | 中文字幕不卡三区| 91麻豆6部合集magnet| 亚洲国产成人av网| 日韩精品一区二区三区老鸭窝| 国产精品中文欧美| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 91免费看片在线观看| 亚洲福利视频导航| 精品国产青草久久久久福利| 成人一区二区三区中文字幕| 亚洲精品视频在线观看免费| 欧美日韩精品一区二区三区蜜桃| 另类调教123区| 国产精品网站在线| 在线免费观看日韩欧美| 免费人成在线不卡| 国产精品全国免费观看高清| 欧美视频完全免费看| 狠狠色丁香婷综合久久| 亚洲日本免费电影| 日韩欧美卡一卡二| 成人国产精品免费| 日韩国产在线观看一区| 国产欧美1区2区3区| 精品视频在线免费观看| 国产精品自拍在线| 亚洲国产精品精华液网站| 久久色中文字幕| 欧洲人成人精品| 精品在线亚洲视频| 亚洲狠狠丁香婷婷综合久久久| 精品成a人在线观看| 一本久久a久久精品亚洲| 国产自产视频一区二区三区| 一区二区三区在线视频观看58| 久久综合九色综合久久久精品综合| 一本在线高清不卡dvd| 国产一区二区三区免费播放| 亚洲国产日日夜夜| 中文字幕第一区二区| 欧美成人女星排行榜| 在线观看一区日韩| 99视频精品在线|