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

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

?? i2c.cpp

?? IIC的驅動
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
#include <stdio.h>
#include <string.h>

#include "..\Armos\ArmLib.h"
#include "..\Armos\ArmOS.h"

#include "I2C.h"

#define DP_ERR(x) x
#define DP_ISR(x) 

#define MAX_RETRY_TO_SEND_START_STOP 10


//void SetSysLed(char on);

struct SI2COperation
{
	uint8 mode; 
	uint8 slave_addr;
	uint8 *buf_ptr;
	int buf_size;
};

enum {I2C_START=0X01, I2C_STOP=0X02, I2C_READ=0X04, I2C_WRITE=0X08, I2C_APPEND_STOP=0X10};
class CI2COperation : public CAbsI2CBus
{
	static void __irq I2CIRQSericeEntry();
	static int buf_pos;
	static struct SI2COperation *cur_op;

	static struct SI2COperation operations[MAX_I2C_OPERATION_COUNT];
	static int op_count;
	static int op_pos; 
	static int send_start_stop_retry_count;

	static bool can_restart	;
	static bool continue_state;
	static TI2CErrorCode error_code;
	
	static bool GetNextOperation(); 
	static void OnEndOfCurOperation_InIsr() ;
	static void ReadNextByte();
	static void StopOnError(TI2CErrorCode an_error_code, bool is_in_isr_and_set_event);
	static bool CanSendStartStop(int state);
	static HANDLE etEndOfOperations;

	bool is_executed;
	bool can_continue_read, can_continue_write;
	uint32 start_time;
	bool AddOperation(uint8 mode, uint8 slave_adder, uint8 *buf, int len);
public:
	virtual bool AddOp_StartRead(uint8 slave_addr, __packed uint8 *buf, int len, bool append_stop);
	virtual bool AddOp_StartWrite(uint8 slave_addr, __packed uint8 *buf, int len, bool append_stop);
	virtual bool AddOp_ContinueRead(__packed uint8 *buf, int len, bool append_stop);
	virtual bool AddOp_ContinueWrite(__packed uint8 *buf, int len, bool append_stop);
	virtual bool AddOp_Stop();
	virtual TI2CErrorCode Execute(uint32 time_out_in_ms = 20, bool block=true);
	virtual TI2CErrorCode GetResult(uint32 time_out_in_ms = 20, bool block=true);
	
	virtual bool Init();
};


int CI2COperation::buf_pos;
struct SI2COperation *CI2COperation::cur_op;
struct SI2COperation CI2COperation::operations[MAX_I2C_OPERATION_COUNT];
int CI2COperation::op_count;
int CI2COperation::op_pos;   
bool CI2COperation::can_restart;
HANDLE CI2COperation::etEndOfOperations;
TI2CErrorCode CI2COperation::error_code;
int CI2COperation::send_start_stop_retry_count;
bool CI2COperation::continue_state;


//			   7   6    5   4  3   2   1  0  
// I2C0CONSET: -  I2EN STA STO SI  AA  -  - 
#define IC_AA    0X04
#define IC_SI    0X08  //中斷標志位
#define IC_STOP  0x10  //發送停止位
#define IC_START 0X20  //發送起始位
#define IC_EN    0X40

#define ClearFlag(x) I2C0CONCLR = x
#define SetFlag(x)   I2C0CONSET = x
#define CheckFlag(x) (I2C0CONSET & (x))

void CI2COperation::OnEndOfCurOperation_InIsr()
{
	if(cur_op->mode & I2C_APPEND_STOP)
	{
		//ClearFlag(IC_START | IC_SI);	//清除 SI STA
		SetFlag(IC_STOP);       //設置 STOP, 并設置軟件中斷,使得下次能繼續觸發中斷
		ClearFlag(IC_START | IC_SI);
		DP_ISR(printk(" STOP I2C "));
	}
	//如果沒有下一個操作,就結束了
	if(! GetNextOperation())
	{
		DP_ISR(printk(" stop isr, state=%x\n", I2C0STAT));
		EnableIsr(ISN_I2C0,false);	
		//SetEventIsr(etEndOfOperations);
		SetEventIsr(etEndOfOperations);
		//SetSysLed(1);
	}else
	{
		SetFlag(IC_SI);
	}
}


void CI2COperation::ReadNextByte()
{
	//連續讀取字節時,如果ARM 最后發送了ACK,那么從設備可能會繼續送出下一個字節
	//這樣就不能發送出停止條件,也就不能中途停止讀取。
	//因此如果已經是最后一個字節了,并且讀取完了以后就要發送停止條件了,那么就不要發送確認
	//另外,如果確認了當前字節,但是芯片還是要重新開始讀取,那么只要發送起始條件,就同時先發送
	//一個停止條件就可以了。
	if((buf_pos == cur_op->buf_size -1) && (cur_op->mode & I2C_APPEND_STOP) != 0)
	{
		ClearFlag(IC_START | IC_SI | IC_AA); //I2C0CONSET = 0x04;	//AA=1
	}else
	{
		SetFlag(IC_AA); //I2C0CONSET = 0x04;	//AA=1
		ClearFlag(IC_START | IC_SI); //I2C0CONSET = 0x04;	//AA=1
	}
}

//遇到錯誤,發送停止條件,并且返回
void CI2COperation::StopOnError(TI2CErrorCode an_error_code, bool is_in_isr_and_set_event)
{
	error_code = an_error_code;
	ClearFlag(IC_START | IC_SI | IC_AA);
	SetFlag(IC_STOP);
	EnableIsr(ISN_I2C0,false);
	if(is_in_isr_and_set_event)	
	{
		SetEventIsr(etEndOfOperations);
	//	putchar('Q');
	}
}


bool CI2COperation::CanSendStartStop(int state)
{
	return (state == 0x18 || //SLA+W transmitted, ack received
			state == 0x20 || //SLA+W transmitted, ack not received
			state == 0x28 || //data transmitted, ack received
			state == 0x30 || //data transmitted, ack not received
			state == 0x38 || //arbitration lost
			state == 0x48 ||
			state == 0x58 ||
			state == 0x88 ||
			state == 0x98 ||
			state == 0xa0 ||
			state == 0xc0 ||
			state == 0xc8 || 
			state == 0xf8);
};

/*
調試信息的意義:
'S' - 發送起始條件
'P' - 發送停止條件
'W' - 發送寫命令
'R' - 發送讀命令
'r' - 讀取一個字節
'w' - 寫入一個字節
'x' - 沒有得到ACK
'A' - 發送讀命令后的第一個ACK
'M' - 多發送一個字節,然后才能發送停止條件
*/
//#define putchar(x)
void __irq CI2COperation::I2CIRQSericeEntry(void)
{	
//-------------------------------------------------------------------------------
// cur_op 這個操作剛剛開始,buf_pos 被設置為-1.
// 此時可能發送起始或者停止條件。
// 如果需要發送起始條件,發送命令后若無響應可重新開始(例如EEPROM 正在編程),因此can_restart 設置為true
//-------------------------------------------------------------------------------
	uint8 state = I2C0STAT & 0xF8;
	if(buf_pos == -1)
	{
		DP_ISR(printk(" new:0x%x ",state));
		buf_pos = 0;
		//如果要發送起始條件
		if(cur_op->mode & (I2C_START | I2C_STOP))
		{
			//這些狀態都可以直接發送起始或者停止條件。
			if(CanSendStartStop(state))
			{
				if((cur_op->mode & I2C_START) ||  state == 0xf8 || state == 0xa0)
				{
					SetFlag(IC_EN | IC_START | IC_STOP | IC_AA);//((cur_op->mode & I2C_STOP)? IC_STOP : 0));
				 	ClearFlag(IC_SI);	
					DP_ISR(putchar('S'));
					if((cur_op->mode & I2C_START) == 0)
						buf_pos = -1;
				}else
				{
					SetFlag(IC_EN | IC_STOP | IC_AA);//((cur_op->mode & I2C_STOP)? IC_STOP : 0));
				 	ClearFlag(IC_SI);	
					OnEndOfCurOperation_InIsr();
					DP_ISR(putchar('P'));
				}
			//必須多發送一個字節,然后才能發送停止條件。這是芯片內部的狀態機不好!
			}else
			{
				I2C0DAT = 0XFF;	//Device addr:0xfe, read
				ClearFlag(IC_SI | IC_AA | IC_START | IC_STOP);
				buf_pos = -1;  //下次還要繼續判斷是否可以發送起始、停止條件了
				DP_ISR(putchar('M')); 
				send_start_stop_retry_count++;
				if(send_start_stop_retry_count > MAX_RETRY_TO_SEND_START_STOP)
					StopOnError(IE_CANNOT_SEND_START_STOP, true);
			}
			can_restart = true;
			goto final;
		}else
		{
			continue_state = true;
			DP_ISR(printk(" continue state=%x\n", I2C0STAT));
		}
	}else
	{
		continue_state = false;
	}
		
//-------------------------------------------------------------------------------
// cur_op 這個操作已經在進行中。如果已經在讀寫數據了,那么 can_restart 設置為false
// 如果讀結束或者寫結束就要檢查下一個操作
// 如果遇到設備沒有響應,則根據 can_restart 確定是否重試。
// 如果遇到錯誤則設置錯誤代碼
//-------------------------------------------------------------------------------
	switch (state)
	{	
		//-----------------------------------------------------------------------
		//發送起始條件后進入這個入口,然后發送讀寫命令
		//-----------------------------------------------------------------------
		case 0x08:	         //---------------- 起始條件    
       	case 0x10:	         //----------------- 重復起始條件 ,如讀操作
			if(cur_op->mode & I2C_READ)
			{
				DP_ISR(putchar('R'));
				I2C0DAT = cur_op->slave_addr | 1; //0:write, 1:read
			}else if(cur_op->mode & I2C_WRITE)
			{
				DP_ISR(putchar('W'));
				I2C0DAT = cur_op->slave_addr & 0xfe; //0:write, 1:read
			}else 
			{
				DP_ISR(putchar('E'));
				OnEndOfCurOperation_InIsr();
			}
       		ClearFlag(IC_START | IC_SI);	//清除 SI STA
       		break;
		//-----------------------------------------------------------------------
		//寫完一個字節后進入這個入口,寫下一個字節
		//-----------------------------------------------------------------------
		case 0x18:	//發送了slv+w,并接收到ACK
       	case 0x28:	//發送I2C0DAT,并接收到ACK
			can_restart = false;
			if(cur_op->mode & I2C_WRITE)
			{
				//如果可以發送下一個字節
				if(buf_pos < cur_op->buf_size)
				{
					DP_ISR(putchar('w'));
					I2C0DAT = cur_op->buf_ptr[buf_pos++];
		   			ClearFlag(IC_START | IC_SI);	//清除 SI STA
				//如果沒有字節可以發送,檢查是否需要發送停止字節
				//并且當前的操作完畢,  需要調整cur_op

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲另类在线视频| 久久精品一区二区三区不卡牛牛| 成人精品gif动图一区| 国产福利91精品| 国内一区二区在线| 国产成人aaa| 成人激情午夜影院| 91视视频在线直接观看在线看网页在线看 | 日韩不卡一二三区| 日韩黄色免费网站| 裸体健美xxxx欧美裸体表演| 精品一区二区三区日韩| 丁香一区二区三区| 色婷婷综合久久久久中文| 欧美怡红院视频| 日韩精品一区二区三区视频| 精品999久久久| 中文字幕一区二区不卡 | 精品福利一区二区三区免费视频| 欧美成人在线直播| 国产三级三级三级精品8ⅰ区| 国产精品情趣视频| 亚洲国产日韩精品| 国产一区二区在线视频| 99这里只有久久精品视频| 在线观看亚洲精品| 精品久久久久久久久久久久久久久久久| 亚洲精品一区二区三区福利| 久久久久国产精品麻豆ai换脸| 26uuu亚洲婷婷狠狠天堂| 26uuu亚洲| 尤物在线观看一区| 麻豆成人免费电影| 91在线码无精品| 日韩精品一区二区三区视频 | 亚洲一级在线观看| 美女视频免费一区| av资源网一区| 日韩欧美在线不卡| 亚洲欧洲制服丝袜| 精品一区二区在线视频| 91成人网在线| 久久久777精品电影网影网 | 91精品国产综合久久久蜜臀粉嫩| 国产午夜精品美女毛片视频| 午夜亚洲国产au精品一区二区| 国产一区二区中文字幕| 欧美精品一二三区| 国产精品国产三级国产aⅴ入口| 九一久久久久久| 亚洲欧洲成人av每日更新| 亚洲国产成人高清精品| 从欧美一区二区三区| 欧美亚洲综合一区| 欧美国产精品v| 久久99这里只有精品| 欧美日韩国产高清一区二区 | 欧美国产精品一区| 六月丁香婷婷久久| 欧美在线观看一区二区| 亚洲天堂成人网| 国产成人在线视频免费播放| 精品奇米国产一区二区三区| 亚洲国产欧美在线| 95精品视频在线| 国产精品久久久久久久久图文区 | 欧美一区二区女人| 一区二区不卡在线播放| 成人精品视频一区二区三区| 日韩女优av电影在线观看| 日韩精品福利网| 欧美日韩一区二区三区四区五区| 亚洲精品国产品国语在线app| 福利电影一区二区三区| 国产日产欧产精品推荐色 | 亚洲成精国产精品女| 91污在线观看| 国产精品国产三级国产普通话99| 国产一区二区看久久| 欧美videossexotv100| 久草这里只有精品视频| 久久综合九色综合97婷婷女人 | 在线电影国产精品| 国内精品国产三级国产a久久| 日韩美女主播在线视频一区二区三区| 日本不卡视频在线观看| 日韩一级免费观看| 黄色日韩网站视频| 国产喂奶挤奶一区二区三区| 成人少妇影院yyyy| 亚洲一区在线视频| 日韩一区二区三区高清免费看看| 九九九久久久精品| 中文一区一区三区高中清不卡| 99久久久国产精品免费蜜臀| 亚洲午夜精品在线| 日韩丝袜情趣美女图片| 国产成人免费在线视频| 亚洲天堂网中文字| 欧美一区二区视频观看视频| 国产经典欧美精品| 亚洲一线二线三线久久久| 日韩欧美自拍偷拍| 成人伦理片在线| 午夜精品久久久久久久99水蜜桃| 日韩精品在线网站| 成人久久视频在线观看| 三级欧美在线一区| 日本一区二区视频在线观看| 欧美这里有精品| 久久91精品国产91久久小草| 亚洲美女免费视频| 精品国产麻豆免费人成网站| 99久久精品免费| 精品亚洲成a人| 亚洲乱码中文字幕| 精品久久久久久久久久久院品网| 一本色道亚洲精品aⅴ| 精品一区二区免费视频| 一区二区高清视频在线观看| 国产三级欧美三级日产三级99| 欧美日韩日日夜夜| 亚洲综合激情小说| 91精品1区2区| 国产精品18久久久久久久久| 午夜一区二区三区视频| 中文一区一区三区高中清不卡| 欧美性大战xxxxx久久久| 成人黄色网址在线观看| 久久精品99国产精品日本| 亚洲国产成人av网| 国产精品久久久久一区二区三区共 | 成人黄色电影在线| 黑人巨大精品欧美一区| 免费视频一区二区| 亚洲午夜激情av| 一区二区三区资源| 亚洲欧美日韩国产一区二区三区| 久久久久久久久久久久久女国产乱| 欧美福利电影网| 在线观看亚洲精品| 91片黄在线观看| 99精品一区二区三区| 国产成人亚洲综合色影视| 久久激情五月婷婷| 精品中文字幕一区二区小辣椒 | 成人免费在线播放视频| 国产日本欧美一区二区| 欧美精品一区二区在线播放| 69堂亚洲精品首页| 8v天堂国产在线一区二区| 欧美少妇xxx| 欧美色男人天堂| 色国产精品一区在线观看| 色婷婷国产精品综合在线观看| 91在线视频在线| 日本韩国欧美一区二区三区| 欧美午夜免费电影| 欧美日韩国产高清一区| 日韩欧美国产一区在线观看| 精品999在线播放| 国产日产欧产精品推荐色| 中文字幕亚洲电影| 亚洲免费观看高清完整版在线观看| 亚洲三级免费电影| 一区二区三区在线观看视频| 亚洲成人手机在线| 免费精品视频最新在线| 国产一区二区电影| 99国产精品久久久久久久久久久| 91丝袜美腿高跟国产极品老师| 欧洲在线/亚洲| 精品美女在线观看| 欧美国产精品久久| 亚洲成人先锋电影| 国产一区二区不卡在线| 色综合天天综合网天天狠天天| 欧美日韩极品在线观看一区| 日韩欧美一二三四区| 欧美高清在线一区| 亚洲二区在线视频| 国产精品白丝av| 欧美在线看片a免费观看| 精品国产在天天线2019| 亚洲欧美日韩综合aⅴ视频| 五月综合激情网| 成人黄色免费短视频| 91精品国产综合久久久蜜臀粉嫩| 欧美国产在线观看| 五月婷婷综合网| 国产不卡在线播放| 欧美日韩另类国产亚洲欧美一级| 久久蜜桃一区二区| 午夜成人免费视频| 91在线观看高清| 精品成人私密视频| 亚洲国产日韩综合久久精品| 成人黄色国产精品网站大全在线免费观看 | 免费观看一级特黄欧美大片| 国产91丝袜在线18|