www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]I2C總線協(xié)議程序在做程序是我在網(wǎng)上找的是周立功的程序,感覺還不錯(cuò)順便轉(zhuǎn)載;在使用的過程中一定要注意時(shí)序、時(shí)間的問題。i2c.c/*I2C.c標(biāo)準(zhǔn)80C51單片機(jī)模擬I2C總線的主機(jī)程序Copyright (c) 2005,廣州周立功單片機(jī)發(fā)

I2C總線協(xié)議程序

在做程序是我在網(wǎng)上找的是周立功的程序,感覺還不錯(cuò)順便轉(zhuǎn)載;在使用的過程中一定要注意時(shí)序、時(shí)間的問題。

i2c.c

/*

I2C.c

標(biāo)準(zhǔn)80C51單片機(jī)模擬I2C總線的主機(jī)程序

Copyright (c) 2005,廣州周立功單片機(jī)發(fā)展有限公司

All rights reserved.

本程序僅供學(xué)習(xí)參考,不提供任何可靠性方面的擔(dān)保;請(qǐng)勿用于商業(yè)目的

*/

#include "I2C.h"

//定義延時(shí)變量,用于宏I2C_Delay()

unsigned char data I2C_Delay_t;

/*

宏定義:I2C_Delay()

功能:延時(shí),模擬I2C總線專用

*/

#define I2C_Delay()

{

I2C_Delay_t = (I2C_DELAY_VALUE);

while ( --I2C_Delay_t != 0 );

}

/*

函數(shù):I2C_Init()

功能:I2C總線初始化,使總線處于空閑狀態(tài)

說明:在main()函數(shù)的開始處,通常應(yīng)當(dāng)要執(zhí)行一次本函數(shù)

*/

void I2C_Init()

{

I2C_SCL = 1;

I2C_Delay();

I2C_SDA = 1;

I2C_Delay();

}

/*

函數(shù):I2C_Start()

功能:產(chǎn)生I2C總線的起始狀態(tài)

說明:

SCL處于高電平期間,當(dāng)SDA出現(xiàn)下降沿時(shí)啟動(dòng)I2C總線

不論SDA和SCL處于什么電平狀態(tài),本函數(shù)總能正確產(chǎn)生起始狀態(tài)

本函數(shù)也可以用來產(chǎn)生重復(fù)起始狀態(tài)

本函數(shù)執(zhí)行后,I2C總線處于忙狀態(tài)

*/

void I2C_Start()

{

I2C_SDA = 1;

I2C_Delay();

I2C_SCL = 1;

I2C_Delay();

I2C_SDA = 0;

I2C_Delay();

I2C_SCL = 0;

I2C_Delay();

}

/*

函數(shù):I2C_Write()

功能:向I2C總線寫1個(gè)字節(jié)的數(shù)據(jù)

參數(shù):

dat:要寫到總線上的數(shù)據(jù)

*/

void I2C_Write(char dat)

{

unsigned char t = 8;

do

{

I2C_SDA = (bit)(dat & 0x80);

dat <<= 1;

I2C_SCL = 1;

I2C_Delay();

I2C_SCL = 0;

I2C_Delay();

} while ( --t != 0 );

}

/*

函數(shù):I2C_Read()

功能:從從機(jī)讀取1個(gè)字節(jié)的數(shù)據(jù)

返回:讀取的一個(gè)字節(jié)數(shù)據(jù)

*/

char I2C_Read()

{

char dat;

unsigned char t = 8;

I2C_SDA = 1; //在讀取數(shù)據(jù)之前,要把SDA拉高

do

{

I2C_SCL = 1;

I2C_Delay();

dat <<= 1;

if ( I2C_SDA ) dat |= 0x01;

I2C_SCL = 0;

I2C_Delay();

} while ( --t != 0 );

return dat;

}

/*

函數(shù):I2C_GetAck()

功能:讀取從機(jī)應(yīng)答位

返回:

0:從機(jī)應(yīng)答

1:從機(jī)非應(yīng)答

說明:

從機(jī)在收到每個(gè)字節(jié)的數(shù)據(jù)后,要產(chǎn)生應(yīng)答位

從機(jī)在收到最后1個(gè)字節(jié)的數(shù)據(jù)后,一般要產(chǎn)生非應(yīng)答位

*/

bit I2C_GetAck()

{

bit ack;

I2C_SDA = 1;

I2C_Delay();

I2C_SCL = 1;

I2C_Delay();

ack = I2C_SDA;

I2C_SCL = 0;

I2C_Delay();

return ack;

}

/*

函數(shù):I2C_PutAck()

功能:主機(jī)產(chǎn)生應(yīng)答位或非應(yīng)答位

參數(shù):

ack=0:主機(jī)產(chǎn)生應(yīng)答位

ack=1:主機(jī)產(chǎn)生非應(yīng)答位

說明:

主機(jī)在接收完每一個(gè)字節(jié)的數(shù)據(jù)后,都應(yīng)當(dāng)產(chǎn)生應(yīng)答位

主機(jī)在接收完最后一個(gè)字節(jié)的數(shù)據(jù)后,應(yīng)當(dāng)產(chǎn)生非應(yīng)答位

*/

void I2C_PutAck(bit ack)

{

I2C_SDA = ack;

I2C_Delay();

I2C_SCL = 1;

I2C_Delay();

I2C_SCL = 0;

I2C_Delay();

}

/*

函數(shù):I2C_Stop()

功能:產(chǎn)生I2C總線的停止?fàn)顟B(tài)

說明:

SCL處于高電平期間,當(dāng)SDA出現(xiàn)上升沿時(shí)停止I2C總線

不論SDA和SCL處于什么電平狀態(tài),本函數(shù)總能正確產(chǎn)生停止?fàn)顟B(tài)

本函數(shù)執(zhí)行后,I2C總線處于空閑狀態(tài)

*/

void I2C_Stop()

{

unsigned int t = I2C_STOP_WAIT_VALUE;

I2C_SDA = 0;

I2C_Delay();

I2C_SCL = 1;

I2C_Delay();

I2C_SDA = 1;

I2C_Delay();

while ( --t != 0 ); //在下一次產(chǎn)生Start之前,要加一定的延時(shí)

}

/*

函數(shù):I2C_Puts()

功能:I2C總線綜合發(fā)送函數(shù),向從機(jī)發(fā)送多個(gè)字節(jié)的數(shù)據(jù)

參數(shù):

SlaveAddr:從機(jī)地址(7位純地址,不含讀寫位)

SubAddr:從機(jī)的子地址

SubMod:子地址模式,0-無子地址,1-單字節(jié)子地址,2-雙字節(jié)子地址

*dat:要發(fā)送的數(shù)據(jù)

Size:數(shù)據(jù)的字節(jié)數(shù)

返回:

0:發(fā)送成功

1:在發(fā)送過程中出現(xiàn)異常

說明:

本函數(shù)能夠很好地適應(yīng)所有常見的I2C器件,不論其是否有子地址

當(dāng)從機(jī)沒有子地址時(shí),參數(shù)SubAddr任意,而SubMod應(yīng)當(dāng)為0

*/

bit I2C_Puts

(

unsigned char SlaveAddr,

unsigned int SubAddr,

unsigned char SubMod,

char *dat,

unsigned int Size

)

{

//定義臨時(shí)變量

unsigned char i;

char a[3];

//檢查長(zhǎng)度

if ( Size == 0 ) return 0;

//準(zhǔn)備從機(jī)地址

a[0] = (SlaveAddr << 1);

//檢查子地址模式

if ( SubMod > 2 ) SubMod = 2;

//確定子地址

switch ( SubMod )

{

case 0:

break;

case 1:

a[1] = (char)(SubAddr);

break;

case 2:

a[1] = (char)(SubAddr >> 8);

a[2] = (char)(SubAddr);

break;

default:

break;

}

//發(fā)送從機(jī)地址,接著發(fā)送子地址(如果有子地址的話)

SubMod++;

I2C_Start();

for ( i=0; i

{

I2C_Write(a[i]);

if ( I2C_GetAck() )

{

I2C_Stop();

return 1;

}

}

//發(fā)送數(shù)據(jù)

do

{

I2C_Write(*dat++);

if ( I2C_GetAck() ) break;

} while ( --Size != 0 );

//發(fā)送完畢,停止I2C總線,并返回結(jié)果

I2C_Stop();

if ( Size == 0 )

{

return 0;

}

else

{

return 1;

}

}

/*

函數(shù):I2C_Gets()

功能:I2C總線綜合接收函數(shù),從從機(jī)接收多個(gè)字節(jié)的數(shù)據(jù)

參數(shù):

SlaveAddr:從機(jī)地址(7位純地址,不含讀寫位)

SubAddr:從機(jī)的子地址

SubMod:子地址模式,0-無子地址,1-單字節(jié)子地址,2-雙字節(jié)子地址

*dat:保存接收到的數(shù)據(jù)

Size:數(shù)據(jù)的字節(jié)數(shù)

返回:

0:接收成功

1:在接收過程中出現(xiàn)異常

說明:

本函數(shù)能夠很好地適應(yīng)所有常見的I2C器件,不論其是否有子地址

當(dāng)從機(jī)沒有子地址時(shí),參數(shù)SubAddr任意,而SubMod應(yīng)當(dāng)為0

*/

bit I2C_Gets

(

unsigned char SlaveAddr,

unsigned int SubAddr,

unsigned char SubMod,

char *dat,

unsigned int Size

)

{

//定義臨時(shí)變量

unsigned char i;

char a[3];

//檢查長(zhǎng)度

if ( Size == 0 ) return 0;

//準(zhǔn)備從機(jī)地址

a[0] = (SlaveAddr << 1);

//檢查子地址模式

if ( SubMod > 2 ) SubMod = 2;

//如果是有子地址的從機(jī),則要先發(fā)送從機(jī)地址和子地址

if ( SubMod != 0 )

{

//確定子地址

if ( SubMod == 1 )

{

a[1] = (char)(SubAddr);

}

else

{

a[1] = (char)(SubAddr >> 8);

a[2] = (char)(SubAddr);

}

//發(fā)送從機(jī)地址,接著發(fā)送子地址

SubMod++;

I2C_Start();

for ( i=0; i

{

I2C_Write(a[i]);

if ( I2C_GetAck() )

{

I2C_Stop();

return 1;

}

}

}

//這里的I2C_Start()對(duì)于有子地址的從機(jī)是重復(fù)起始狀態(tài)

//對(duì)于無子地址的從機(jī)則是正常的起始狀態(tài)

I2C_Start();

//發(fā)送從機(jī)地址

I2C_Write(a[0]+1);

if ( I2C_GetAck() )

{

I2C_Stop();

return 1;

}

//接收數(shù)據(jù)

for (;;)

{

*dat++ = I2C_Read();

if ( --Size == 0 )

{

I2C_PutAck(1);

break;

}

I2C_PutAck(0);

}

//接收完畢,停止I2C總線,并返回結(jié)果

I2C_Stop();

return 0;

}

i2c.h

/*

I2C.h

標(biāo)準(zhǔn)80C51單片機(jī)模擬I2C總線的主機(jī)程序頭文件

Copyright (c) 2005,廣州周立功單片機(jī)發(fā)展有限公司

All rights reserved.

本程序僅供學(xué)習(xí)參考,不提供任何可靠性方面的擔(dān)保;請(qǐng)勿用于商業(yè)目的

*/

#ifndef _I2C_H_

#define _I2C_H_

#include

//模擬I2C總線的引腳定義

sbit I2C_SCL = P3^4;

sbit I2C_SDA = P3^5;

//定義I2C總線時(shí)鐘的延時(shí)值,要根據(jù)實(shí)際情況修改,取值1~255

//SCL信號(hào)周期約為(I2C_DELAY_VALUE*4+15)個(gè)機(jī)器周期

#define I2C_DELAY_VALUE 12

//定義I2C總線停止后在下一次開始之前的等待時(shí)間,取值1~65535

//等待時(shí)間約為(I2C_STOP_WAIT_VALUE*8)個(gè)機(jī)器周期

//對(duì)于多數(shù)器件取值為1即可;但對(duì)于某些器件來說,較長(zhǎng)的延時(shí)是必須的

#define I2C_STOP_WAIT_VALUE 120

//I2C總線初始化,使總線處于空閑狀態(tài)

void I2C_Init();

//I2C總線綜合發(fā)送函數(shù),向從機(jī)發(fā)送多個(gè)字節(jié)的數(shù)據(jù)

bit I2C_Puts

(

unsigned char SlaveAddr,

unsigned int SubAddr,

unsigned char SubMod,

char *dat,

unsigned int Size

);

//I2C總線綜合接收函數(shù),從從機(jī)接收多個(gè)字節(jié)的數(shù)據(jù)

bit I2C_Gets

(

unsigned char SlaveAddr,

unsigned int SubAddr,

unsigned char SubMod,

char *dat,

unsigned int Size

);

#endif //_I2C_H_


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

以太網(wǎng)雖具有高速率、高帶寬等特性,但由于整車的發(fā)展具有階段性且需兼顧整車經(jīng)濟(jì)性等方面,因此以太網(wǎng)的發(fā)展趨勢(shì)亦存在漸進(jìn)性。

關(guān)鍵字: 車通信 高帶寬 總線協(xié)議

Modbus是由Modicon(現(xiàn)為施耐德電氣公司的一個(gè)品牌)在1979年發(fā)明的一種工業(yè)控制總線協(xié)議,是全球第一個(gè)真正用于工業(yè)現(xiàn)場(chǎng)的總線協(xié)議。

關(guān)鍵字: Modbus 通訊協(xié)議 總線協(xié)議

在這篇文章中,小編將為大家?guī)鞢AN總線協(xié)議的相關(guān)報(bào)道。如果你對(duì)本文即將要講解的內(nèi)容存在一定興趣,不妨繼續(xù)往下閱讀哦。

關(guān)鍵字: CAN 總線 總線協(xié)議

    本文主要介紹的就是基于DM642的視頻采集處理系統(tǒng)中I2C模塊的正確初始化,以及通過I2C總線正確地對(duì)視頻解碼芯片SAA7115的寄存器讀/寫程序。   1 I

關(guān)鍵字: dm642 i2c 視頻采集

  Modbus是由Modicon(現(xiàn)為施耐德電氣公司的一個(gè)品牌)在1979年發(fā)明的,是全球第一個(gè)真正用于工業(yè)現(xiàn)場(chǎng)的總線協(xié)議。為更好地普及和推動(dòng)Modbus在基于以太網(wǎng)上的分布式應(yīng)用,目前施耐德

關(guān)鍵字: modbus協(xié)議 總線協(xié)議

    串行總線和并行總線相比具有結(jié)構(gòu)簡(jiǎn)單、占用引腳少、成本低的優(yōu)點(diǎn)。常見的串行總線有USB、IEEE1394、I2C等,其中I2C總線具有使用簡(jiǎn)單的特點(diǎn),在單片機(jī)、串行E2P

關(guān)鍵字: vhdl i2c 串行總線

  I2C簡(jiǎn)介   I2C總線是由Philips公司開發(fā)的一種簡(jiǎn)單、雙向二線制同步串行總線。它只需要兩根線即可在連接于總線上的器件之間傳送信息。主器件用于啟動(dòng)總線傳送數(shù)據(jù),并產(chǎn)生時(shí)鐘以開

關(guān)鍵字: Arduino i2c

本項(xiàng)目開發(fā)了一個(gè)使用 Xilinx 公司的 SPARTAN3A-DSP FPGA 作為目標(biāo)開發(fā)板,采集數(shù)字和模擬傳感器數(shù)據(jù),并將傳感器數(shù)據(jù)采用 I2C 接口與上級(jí)無線傳感器網(wǎng)絡(luò)進(jìn)行通信的環(huán)境監(jiān)測(cè)

關(guān)鍵字: i2c 無線傳感器網(wǎng)絡(luò) 環(huán)境監(jiān)測(cè)

2020年6月17日-國(guó)內(nèi)領(lǐng)先的信號(hào)鏈芯片及其解決方案提供商蘇州納芯微電子股份有限公司(以下簡(jiǎn)稱“納芯微”)日前宣布推出五款I(lǐng)2C總線接口類芯片產(chǎn)品。

關(guān)鍵字: i2c 納芯微 接口產(chǎn)品
關(guān)閉