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

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

?? i2c state machine.c

?? bf561的dm9000測試程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
#include "I2C State Machine.h"

//--------------------------------------------------------------------------//
// Variables for I2C state machine											//
//--------------------------------------------------------------------------//
t_I2C_Main_States	m_SM_State;			// current state
t_I2C_Main_States	m_SM_Next_State;	// determines the following state
t_I2C_Message		m_Current_Message;	// message to be transferred
t_I2C_Transfer		m_Current_Transfer;	// one byte to be transferred
t_I2C_SM_Path		m_Current_SM_Path;	// used to determine SM_Next_State
bool				m_ACK_Error;		// status of last acknowledge cycle

//--------------------------------------------------------------------------//
// Function:	I2C_Setup													//
//																			//
// Access:		Public														//
//																			//
// Parameters:	New_Message													//
//					New Message to be transmitted via I2C interface			//
//																			//
// Return:		None														//
//																			//
// Description:	This function is used to reset the internal state of the	//
//				state machine and to store the message passed as parameter	//
//				inside the SM.												//
//				After this function has been called, function				//
//				I2C_Advance_State() should be called repeatedly until it	//
//				returns TRUE (then the complete message has been			//
//				transferred or an error has occured).						//
//--------------------------------------------------------------------------//
void I2C_Setup(t_I2C_Message *New_Message)
{
	m_SM_State			= I2C_IDLE;
	m_SM_Next_State		= I2C_IDLE;
	m_Current_SM_Path	= I2C_SM_Write_Path;
	m_ACK_Error			= false;
	m_Current_Message	= *New_Message;

	I2C_Set_SDA_Output();
	I2C_Set_SCL_Output();
}

//--------------------------------------------------------------------------//
// Function:	Get_Error_Status											//
//																			//
// Access:		Public														//
//																			//
// Parameters:	None														//
//																			//
// Return:		None														//
//					false:	No error occured in previous state machine cycle//
//					true:	Error occured in previous state machine cycle	//
//																			//
// Description:	This function should be called after a state machine cycle	//
//				is finished to determine if an error (missing ACK from the	//
//				Slave) has occured.											//
//--------------------------------------------------------------------------//
bool I2C_Get_Error_Status(void)
{
	return(m_ACK_Error);
}

//--------------------------------------------------------------------------//
// Function:	Advance_State												//
//																			//
// Access:		Public														//
//																			//
// Parameters:	None														//
//																			//
// Return:		Status of operation											//
//					false:	State machine cycle not finished				//
//					true:	State machine cycle finished					//
//																			//
// Description:	This is called from the user and performs one state			//
//				transition in the I2C main state machine per call.			//
//				It needs to be called until it returns "true", then the SM	//
//				has finished one complete transfer (one message has been	//
//				sent/received).												//
//--------------------------------------------------------------------------//
bool I2C_Advance_State(void)
{
	bool Return_Value = false;

	switch(m_SM_State)
	{
		// state IDLE
		case I2C_IDLE:

			// state transition IDLE -> START
			m_SM_State			= I2C_START;
			m_Current_SM_Path	= I2C_SM_Write_Path;

			// set Device Address for next write
			m_Current_Transfer.Byte			= m_Current_Message.Dev_Addr & ~I2C_READ_WRITE_BIT;
			m_Current_Transfer.Bit_Count	= I2C_DEVICE_LENGTH;

			break;

		// state START
		case I2C_START:

			if(I2C_Execute_START())
			{
				// state transition START -> WRITE_DEV_ADDR
				m_SM_State = I2C_WRITE_DEV_ADDR;
			}

			break;

		// state WRITE_DEV_ADDR
		case I2C_WRITE_DEV_ADDR:

			if(I2C_Execute_WRITE())
			{
				// state transition WRITE_DEV_ADDR -> CHECK_ACK
				m_SM_State = I2C_CHECK_ACK;

				// determine if write or read cycle has to be performed
				if(m_Current_SM_Path == I2C_SM_Write_Path)
				{
					// prepare state transition CHECK_ACK -> WRITE_REG_ADDR
					m_SM_Next_State = I2C_WRITE_REG_ADDR;
			
					// set Register Address for next write
					m_Current_Transfer.Byte			= m_Current_Message.Reg_Addr;
					m_Current_Transfer.Bit_Count	= I2C_REGISTER_LENGTH;
				}
				else
				{
					// prepare state transition CHECK_ACK -> READ_DATA
					m_SM_Next_State = I2C_READ_DATA;
				}
			}

			break;

		// state WRITE_REG_ADDR
		case I2C_WRITE_REG_ADDR:

			if(I2C_Execute_WRITE())
			{
				// state transition WRITE_REG_ADDR -> CHECK_ACK
				m_SM_State = I2C_CHECK_ACK;

				// check if R/W bit is set; if it is set, then a read cycle is to be performed
				if(m_Current_Message.Dev_Addr & I2C_READ_WRITE_BIT)
				{
					// prepare state transition CHECK_ACK -> START
					m_SM_Next_State = I2C_START;

					// next time around the SM take the "read path"
					m_Current_SM_Path	= I2C_SM_Read_Path;

					// set Device Address for next write
					m_Current_Transfer.Byte			= m_Current_Message.Dev_Addr;
					m_Current_Transfer.Bit_Count	= I2C_DEVICE_LENGTH;
				}
				else
				{
					// prepare state transition CHECK_ACK -> WRITE_DATA
					m_SM_Next_State = I2C_WRITE_DATA;

					// set Data for next write
					m_Current_Transfer.Byte			= m_Current_Message.Data;
					m_Current_Transfer.Bit_Count	= I2C_DATA_LENGTH;
				}
			}

			break;

		// state WRITE_DATA
		case I2C_WRITE_DATA:

			if(I2C_Execute_WRITE())
			{
				// state transition WRITE_DATA -> CHECK_ACK
				m_SM_State		= I2C_CHECK_ACK;
				// prepare state transition CHECK_ACK -> STOP
				m_SM_Next_State	= I2C_STOP;
			}

			break;

		// state READ_DATA
		case I2C_READ_DATA:

			if(I2C_Execute_READ())
			{
				// state transition READ_DATA -> SEND_ACK
				m_SM_State = I2C_SEND_ACK;

				// set Acknowledge for next write
				m_Current_Transfer.Byte			= I2C_ACK_VALUE;
				m_Current_Transfer.Bit_Count	= I2C_ACK_LENGTH;
			}

			break;

		// state CHECK_ACK
		case I2C_CHECK_ACK:

			if(I2C_Execute_CHECK_ACK())
			{
				// check if Slave acknowledges access
				if(m_ACK_Error)
				{
					// state transition CHECK_ACK -> STOP (error occured)
					m_SM_State = I2C_STOP;
				}
				else
				{
					// perform (earlier) prepared state transition
					m_SM_State = m_SM_Next_State;
				}
			}

			break;

		// state SEND_ACK
		case I2C_SEND_ACK:

			if(I2C_Execute_WRITE())
			{
				// state transition SEND_ACK -> STOP
				m_SM_State = I2C_STOP;
			}

			break;

		// state STOP
		case I2C_STOP:

			if(I2C_Execute_STOP())
			{
				// state transition STOP -> IDLE
				m_SM_State = I2C_IDLE;

				Return_Value = true;				// SM is finished
			}

			break;
	}

	return(Return_Value);
}


//--------------------------------------------------------------------------//
// Function:	Execute_START												//
//																			//
// Access:		Private														//
//																			//
// Parameters:	None														//
//																			//
// Return:		Status of I2C Start condition								//
//					false:	I2C Start condition not finished				//
//					true:	I2C Start condition finished					//
//																			//
// Description:	This function is called from within the SPI main state		//
//				machine.													//
//				It executes a state machine that implements the I2C Stop	//
//				condition by setting SDA to 1 while SCL is 1.				//
//--------------------------------------------------------------------------//
bool I2C_Execute_START(void)
{
	bool					Return_Value		= false;
	static t_I2C_Sub_States	I2C_START_SM_State	= I2C_SET_HIGH_SCL_SDA;

	switch(I2C_START_SM_State)
	{
		// state SET_HIGH_SCL_SDA
		case I2C_SET_HIGH_SCL_SDA:

			// state transition SET_HIGH_SCL_SDA -> SET_LOW_SDA
			I2C_START_SM_State = I2C_SET_LOW_SDA;

			I2C_Set_High_SCL();
			I2C_Set_High_SDA();

			break;

		// state SET_LOW_SDA
		case I2C_SET_LOW_SDA:

			// state transition SET_LOW_SDA -> SET_LOW_SCL
			I2C_START_SM_State = I2C_SET_LOW_SCL;

			I2C_Set_Low_SDA();

			break;

		// state SET_LOW_SCL
		case I2C_SET_LOW_SCL:

			// state transition SET_LOW_SCL -> SET_HIGH_SCL_SDA
			I2C_START_SM_State = I2C_SET_HIGH_SCL_SDA;

			I2C_Set_Low_SCL();

			Return_Value = true;				// SM is finished

			break;
	}

	return(Return_Value);
}

//--------------------------------------------------------------------------//
// Function:	Execute_STOP												//
//																			//
// Access:		Private														//

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
懂色av中文字幕一区二区三区| 欧美日韩一区二区三区四区五区| 成人18精品视频| 在线中文字幕不卡| 精品国产一区二区亚洲人成毛片 | 欧美专区日韩专区| 久久一区二区视频| 午夜久久福利影院| 91在线你懂得| 国产精品色在线观看| 青青草原综合久久大伊人精品优势 | 日本高清不卡视频| 国产日本一区二区| 久久av资源站| 这里只有精品视频在线观看| 亚洲欧洲三级电影| 国产宾馆实践打屁股91| 日韩免费看的电影| 日韩电影在线免费| 精品视频色一区| 亚洲三级电影全部在线观看高清| 国产精品一区二区三区乱码 | 午夜欧美大尺度福利影院在线看| 91视频com| 亚洲欧洲av色图| 99re这里只有精品首页| 国产亚洲一区二区三区在线观看| 看片的网站亚洲| 日韩精品一区在线观看| 蜜乳av一区二区三区| 制服视频三区第一页精品| 性久久久久久久久久久久 | 成人性生交大片免费看在线播放| 精品国产凹凸成av人网站| 开心九九激情九九欧美日韩精美视频电影| 欧美影视一区在线| 亚洲高清免费视频| 欧美剧情片在线观看| 青青国产91久久久久久| 日韩久久久精品| 国产麻豆午夜三级精品| 中文字幕欧美激情| 99国产精品久| 亚洲电影一区二区| 正在播放一区二区| 国精品**一区二区三区在线蜜桃| 精品国产91乱码一区二区三区| 激情五月婷婷综合网| 国产精品丝袜一区| 色哟哟国产精品| 天天色 色综合| 久久综合色婷婷| 成人av资源在线| 亚洲国产精品久久久久秋霞影院 | 国产v日产∨综合v精品视频| 国产精品色在线观看| 欧美性生活久久| 免费观看日韩av| 国产精品久久毛片| 欧美撒尿777hd撒尿| 激情综合五月天| 中文字幕一区二区三区蜜月| 欧美性大战久久久久久久蜜臀| 男男成人高潮片免费网站| 中文字幕欧美日本乱码一线二线| 日本电影欧美片| 国产资源精品在线观看| 亚洲人成网站精品片在线观看 | 成人综合在线网站| 亚洲午夜久久久久久久久电影网| 日韩精品一区二区三区老鸭窝| 国产经典欧美精品| 午夜欧美视频在线观看| 久久色.com| 欧美日韩一区 二区 三区 久久精品| 久热成人在线视频| 有码一区二区三区| 久久久久久久久久久久电影| 欧美图区在线视频| 国产成人福利片| 奇米精品一区二区三区在线观看一| 中文字幕欧美国产| 欧美mv和日韩mv的网站| 91福利视频网站| 成人综合婷婷国产精品久久蜜臀 | 欧美在线影院一区二区| 国产一区福利在线| 视频在线观看一区| 亚洲欧美一区二区三区久本道91| 欧美r级电影在线观看| 欧美日韩激情一区二区三区| 99综合电影在线视频| 激情文学综合丁香| 亚洲成av人片一区二区三区| 亚洲欧洲性图库| 亚洲国产成人私人影院tom| 欧美va亚洲va在线观看蝴蝶网| 欧美日韩国产天堂| 色婷婷av一区二区三区大白胸| 国产激情一区二区三区桃花岛亚洲| 免费人成精品欧美精品| 亚洲国产一区二区a毛片| 亚洲日本一区二区三区| 国产精品丝袜在线| 中文字幕欧美区| 久久精品亚洲麻豆av一区二区| 欧美大胆一级视频| 日韩免费视频一区二区| 91精品福利在线一区二区三区| 欧美性视频一区二区三区| 91成人免费网站| 欧美亚洲国产一区二区三区va| 色综合久久综合中文综合网| 91天堂素人约啪| 色偷偷久久人人79超碰人人澡| aaa国产一区| 91黄色免费网站| 欧美在线免费观看视频| 欧美特级限制片免费在线观看| 欧美亚洲综合色| 欧美日韩高清影院| 日韩一区二区免费在线电影| 欧美一区二区三区日韩视频| 日韩久久精品一区| 久久日韩粉嫩一区二区三区| 久久久精品影视| 中文字幕在线不卡一区| 亚洲狠狠丁香婷婷综合久久久| 一区二区三区蜜桃网| 亚洲成人一区二区| 人禽交欧美网站| 国产一区二区精品在线观看| 国产精品99久久久久久似苏梦涵| 国产91精品露脸国语对白| 不卡在线观看av| 欧美性色黄大片手机版| 欧美一区二区三区在线看| 精品电影一区二区| 中文字幕亚洲视频| 亚洲国产精品一区二区久久| 日本不卡在线视频| 懂色av一区二区三区蜜臀| 97超碰欧美中文字幕| 欧美日韩三级一区| 久久久久亚洲蜜桃| 亚洲美女在线国产| 青青草成人在线观看| 成人三级伦理片| 欧美日韩精品一区二区天天拍小说| 精品少妇一区二区三区在线视频| 中文字幕不卡的av| 三级一区在线视频先锋 | 色哟哟一区二区在线观看 | 欧美亚洲国产怡红院影院| 欧美一级黄色录像| 国产精品视频在线看| 亚洲一区二区四区蜜桃| 国产一区中文字幕| 91久久奴性调教| 久久久欧美精品sm网站| 亚洲二区在线视频| 成人va在线观看| 日韩一区二区三区免费观看| 国产精品第一页第二页第三页| 日本中文字幕一区二区有限公司| 成人少妇影院yyyy| 欧美一二三在线| 日韩一区二区三区四区| 亚洲人妖av一区二区| 精品一区二区三区免费播放| 91福利精品第一导航| 国产亚洲va综合人人澡精品| 日韩vs国产vs欧美| 欧洲精品一区二区| 1区2区3区欧美| 国产福利电影一区二区三区| 日韩一区二区三区四区| 亚洲制服丝袜一区| jlzzjlzz亚洲日本少妇| 2024国产精品| 视频在线观看91| 欧洲中文字幕精品| 亚洲日本乱码在线观看| 成人午夜免费av| 国产日产亚洲精品系列| 国产一区二区三区黄视频| 7777精品伊人久久久大香线蕉| 一区二区三区电影在线播| 99视频精品免费视频| 国产精品视频免费看| 国产精品一卡二卡| 国产偷v国产偷v亚洲高清| 精品夜夜嗨av一区二区三区| 欧美一区二区三区在线视频| 亚洲成a人片综合在线| 欧美日韩一区二区在线观看视频 | 全国精品久久少妇| 91精品婷婷国产综合久久竹菊| 亚洲第一av色| 欧美福利一区二区|