當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀] /******************************************************************** ** File : I2C.c " Master Read Write | ** Version : 1.0 ** Description:

 

/******************************************************************

**
** File : I2C.c " Master Read Write |
** Version : 1.0
** Description: I2C 查詢法讀寫24C02
** Author : LightWu
** Date : 2013-4-26
** 必須注意多字節(jié)數(shù)據(jù)讀取時,發(fā)送停止位需要在最后一個字節(jié)讀取之前
** 否則數(shù)據(jù)讀取后,停止位發(fā)送容易失敗,導(dǎo)致從機接收不到停止位。
*******************************************************************/


#include


//注意:兩次發(fā)送間隔必須要有延時,否則不能再次發(fā)送,串口發(fā)送格式:


unsigned char PTxData[250]; // Pointer to TX data
unsigned char PRxData[250]; // Pointer to RX data




void UartInit(void)
{
if (CALBC1_1MHZ==0xFF) // If calibration constant erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
P3SEL |= 0x30; // P3.4,5 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 104; // 1MHz 9600; (104)decimal = 0x068h
UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
}
void UartSend( unsigned char Data )
{
UCA0TXBUF = Data; // TX -> RXed character
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?,發(fā)送緩沖區(qū)空

}
void IICInit(void)
{
UCB0CTL1 |= UCSWRST; // Enable SW reset
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
UCB0BR0 = 12; // fSCL = SMCLK/12 = ~100kHz
UCB0BR1 = 0;
UCB0I2CSA = 0xA0>>1; // Slave Address is ,注意地址需要右移一位,24C02地址為0XA0,故要寫入0X50
// 7位地址模式,器件會發(fā)送一位讀寫位,正好8位。
UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation

}


/*******************************************
函數(shù)名稱:Ucb0I2c_Start(void)
功 能:I2C主機模式,發(fā)送寫起始條件
參 數(shù):無

返回值 :無
********************************************/
void Ucb0I2c_Start(void)
{
UCB0I2CSA = 0x50; // Slave Address is 0xd0
while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition
while(!(IFG2&UCB0TXIFG)); //等待傳送完
IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag
}
void IICSendData( unsigned char Addr ,unsigned char Data )
{
int i;
for(i=3000;i>0;i--); //兩次發(fā)送間隔必須要有延時,否則不能再次發(fā)送


Ucb0I2c_Start();

UCB0TXBUF = Addr; // Load TX buffer
while(!(IFG2&UCB0TXIFG)); //等待傳送完成
IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag

UCB0TXBUF = Data; // Load TX buffer
while(!(IFG2&UCB0TXIFG)); //等待傳送完成
IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag

UCB0CTL1 |= UCTXSTP; // I2C stop condition

}


void IICReadData( unsigned char Addr )
{
int i;
for(i=3000;i>0;i--); //兩次發(fā)送間隔必須要有延時,否則不能再次發(fā)送

Ucb0I2c_Start();

UCB0TXBUF = Addr; // Load TX buffer
while(!(IFG2&UCB0TXIFG)); //等待傳送完成
IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag

UCB0CTL1 &= ~UCTR ; // I2C RX, Read
UCB0CTL1 |= UCTXSTT; // I2C RX, start condition

while(!(IFG2&UCB0RXIFG)); //等待接收完成
IFG2&=~UCB0RXIFG;
PRxData[0] = UCB0RXBUF; // Read RX buffer
while(!(IFG2&UCB0RXIFG)); //等待接收完成
IFG2&=~UCB0RXIFG;
PRxData[1] = UCB0RXBUF; // Read RX buffer
while(!(IFG2&UCB0RXIFG)); //等待接收完成
IFG2&=~UCB0RXIFG;
PRxData[2] = UCB0RXBUF; // Read RX buffer
while(!(IFG2&UCB0RXIFG)); //等待接收完成
IFG2&=~UCB0RXIFG;

//必須注意發(fā)送停止位在最后一個字節(jié)讀取之前
UCB0CTL1 |= UCTXSTP; // I2C stop condition

PRxData[3] = UCB0RXBUF; // Read RX buffer
}
int main(void)
{

WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P3SEL |= 0x06; // Assign I2C pins to USCI_B0

IICInit();

UartInit();


while (1)
{
UartSend('M');

IICSendData(0X00,'A');
IICSendData(0X01,'B');
IICSendData(0X02,'C');
IICSendData(0X03,'D');
IICSendData(0X04,'E');
IICSendData(0X05,'F');
IICSendData(0X06,'H');
IICSendData(0X07,'J');



IICReadData(0x00);
UartSend(PRxData[0]);
UartSend(PRxData[1]);
UartSend(PRxData[2]);
UartSend(PRxData[3]);



}
}

 

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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉