MSP430I2C通信_第1頁
MSP430I2C通信_第2頁
MSP430I2C通信_第3頁
MSP430I2C通信_第4頁
MSP430I2C通信_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、I2C通信通信內(nèi)容提要內(nèi)容提要I2C協(xié)議協(xié)議I2C通信通信I2C應(yīng)用應(yīng)用數(shù)碼管和矩陣鍵盤數(shù)碼管和矩陣鍵盤MSP430G2553引腳圖引腳圖I2C線與線與 兩條總線:兩條總線:串行時鐘線串行時鐘線SCL和串行數(shù)據(jù)線和串行數(shù)據(jù)線SDA 兩條總線都被上拉電阻拉到VCC,線與輸出。I2C協(xié)議的基本規(guī)范協(xié)議的基本規(guī)范 完整幀包括起始位、地址位、讀寫位、應(yīng)答位、數(shù)據(jù)位 、數(shù)據(jù)位、應(yīng)答位.數(shù)據(jù)位、應(yīng)答位、停止位。從起始位開始每幀數(shù)據(jù)都是9位,其中第一幀是7位從機(jī)地址+1位讀寫標(biāo)識+1位數(shù)據(jù)接收應(yīng)答位;后續(xù)的每幀都是8位數(shù)據(jù)+1位數(shù)據(jù)接收方應(yīng)答。R/W=0,主機(jī)發(fā)數(shù)據(jù),ACK由從機(jī)負(fù)責(zé)拉低;反之如此。I2C協(xié)

2、議的起止位協(xié)議的起止位 81.1.在時鐘線高電平時,數(shù)據(jù)線下降沿代表了起始位在時鐘線高電平時,數(shù)據(jù)線下降沿代表了起始位STARTSTART2.2.在時鐘線高電平時,數(shù)據(jù)線上升沿代表了停止位在時鐘線高電平時,數(shù)據(jù)線上升沿代表了停止位STOPSTOP3.3.在時鐘線高電平期間,數(shù)據(jù)線上的數(shù)據(jù)保持穩(wěn)定在時鐘線高電平期間,數(shù)據(jù)線上的數(shù)據(jù)保持穩(wěn)定4.4.數(shù)據(jù)線上的數(shù)據(jù)只有當(dāng)數(shù)據(jù)線上的數(shù)據(jù)只有當(dāng)時鐘線低電平期間時鐘線低電平期間才能轉(zhuǎn)換。才能轉(zhuǎn)換。I2C的地址規(guī)范 7位地址模式位地址模式10位地址模式位地址模式I2CI2C的多主機(jī)仲裁的多主機(jī)仲裁小地址通信優(yōu)先小地址通信優(yōu)先仲裁過程中,多主機(jī)時鐘實(shí)現(xiàn)仲裁過程

3、中,多主機(jī)時鐘實(shí)現(xiàn)“線與線與”功能。功能。 /| /| MSP430F6638 100k 100k MSP430F6638 slave | | master - | | - |XIN P8.5/UCB0SDA| |P8.5/UCB0SDA XIN|- | | | | | |XOUT | | | XOUT|- | P8.6/UCB0SCL|P8.6/UCB0SCL | | | | |主機(jī)在不停地發(fā)數(shù)據(jù)給從機(jī),時鐘為主機(jī)在不停地發(fā)數(shù)據(jù)給從機(jī),時鐘為1MHz1MHz例例1:#include unsigned char TXData;unsigned char TXByteCtr;void main(

4、void) WDTCTL = WDTPW + WDTHOLD; / Stop WDT P8SEL |= BIT5+BIT6; / Assign P8.5 to UCB0SDA and UCB0SCL P8DIR |= BIT6; / P8.6 to UCB0SCL UCB0CTL1 = UCSSEL_2 + UCSWRST; / Use SMCLK, keep SW reset UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; / I2C Master, synchronous mode UCB0BR0 = 10; UCB0BR1 = 0; UCB0I2CSA = 0

5、 x48; / Slave Address is 048h UCB0CTL1 &= UCSWRST; / Clear SW reset, resume operation UCB0IE |= UCTXIE; / Enable TX interrupt TXData = 0 x01; / Holds TX data while (1) TXByteCtr = 1; / Load TX byte counter while (UCB0CTL1 & UCTXSTP); / Ensure stop condition got sent UCB0CTL1 |= UCTR + UCTXST

6、T; / I2C TX, start condition _bis_SR_register(LPM0_bits + GIE); / Enter LPM0 w/ interrupts TXData+; / Increment data byte 主機(jī)主機(jī)#pragma vector = USCI_B0_VECTOR_interrupt void USCI_B0_ISR(void) switch(_even_in_range(UCB0IV,12) case 0: break; / Vector 0: No interrupts case 2: break; / Vector 2: ALIFG ca

7、se 4: break; / Vector 4: NACKIFG case 6: break; / Vector 6: STTIFG case 8: break; / Vector 8: STPIFG case 10: break; / Vector 10: RXIFG case 12: / Vector 12: TXIFG if (TXByteCtr) / Check TX byte counter UCB0TXBUF = TXData; / Load TX buffer TXByteCtr-; / Decrement TX byte counter else UCB0CTL1 |= UCT

8、XSTP; / I2C stop condition UCB0IFG &= UCTXIFG; / Clear USCI_B0 TX int flag _bic_SR_register_on_exit(LPM0_bits); / Exit LPM0 break; default: break; #include volatile unsigned char RXData;void main(void) WDTCTL = WDTPW + WDTHOLD; / Stop WDT P8SEL |= BIT5+BIT6; / Assign P8.5/6 to UCB0SDA and UCB0SC

9、L UCB0CTL1 |= UCSWRST; / Enable SW reset UCB0CTL0 = UCMODE_3 + UCSYNC; / I2C Slave, synchronous mode UCB0I2COA = 0 x32; / Own Address is 032h UCB0CTL1 &= UCSWRST; / Clear SW reset, resume operation UCB0IE |= UCRXIE; / Enable RX interrupt while (1) _bis_SR_register(LPM0_bits + GIE); / Enter LPM0,

10、 enable interrupts 從機(jī)從機(jī)#pragma vector = USCI_B0_VECTOR_interrupt void USCI_B0_ISR(void) switch(_even_in_range(UCB0IV,12) case 0: break; / Vector 0: No interrupts case 2: break; / Vector 2: ALIFG case 4: break; / Vector 4: NACKIFG case 6: break; / Vector 6: STTIFG case 8: break; / Vector 8: STPIFG ca

11、se 10: / Vector 10: RXIFG RXData = UCB0RXBUF; / Get RX data _bic_SR_register_on_exit(LPM0_bits); / Exit LPM0 break; case 12: break; / Vector 12: TXIFG default: break; /| /| MSP430G2xx3 100k 100k MSP430G2xx3 slave | | master - | | - -|XIN P1.7/UCB0SDA |P1.7/UCB0SDA XIN|- | | | | -|XOUT | | XOUT|- | P

12、1.6/UCB0SCL |P1.6/UCB0SCL | | | | |主機(jī)在不停地發(fā)數(shù)據(jù)給從機(jī),時鐘為主機(jī)在不停地發(fā)數(shù)據(jù)給從機(jī),時鐘為1MHz1MHz例例2:#include 主機(jī)主機(jī)unsigned char TXData;unsigned char TXByteCtr;int main(void) WDTCTL = WDTPW + WDTHOLD; P1SEL |= BIT6 + BIT7; P1SEL2|= BIT6 + BIT7; UCB0CTL1 |= UCSWRST; UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; UCB0CTL1 = UCSSEL_2

13、 ; UCB0BR0 = 10; UCB0BR1 = 0; UCB0I2CSA = 0 x48; UCB0CTL1 &= UCSWRST; IE2 |= UCB0TXIE; TXData = 0 x00; while (1) TXByteCtr = 1; while (UCB0CTL1 & UCTXSTP); UCB0CTL1 |= UCTR + UCTXSTT; _bis_SR_register(CPUOFF + GIE); TXData+; #pragma vector = USCIAB0TX_VECTOR_interrupt void USCIAB0TX_ISR(void

14、) if (TXByteCtr) / Check TX byte counter UCB0TXBUF = TXData; / Load TX buffer TXByteCtr-; / Decrement TX byte counter else UCB0CTL1 |= UCTXSTP; / I2C stop condition IFG2 &= UCB0TXIFG; / Clear USCI_B0 TX int flag _bic_SR_register_on_exit(CPUOFF); / Exit LPM0 #include 從機(jī)從機(jī)volatile unsigned char RX

15、Data;int main(void) WDTCTL = WDTPW + WDTHOLD; P1SEL |= BIT6 + BIT7; P1SEL2|= BIT6 + BIT7; UCB0CTL1 |= UCSWRST; UCB0CTL0 = UCMODE_3 + UCSYNC; UCB0I2COA = 0 x32; UCB0CTL1 &= UCSWRST; IE2 |= UCB0RXIE; while (1) _bis_SR_register(CPUOFF + GIE); _no_operation(); #pragma vector = USCIAB0TX_VECTOR_inter

16、rupt void USCIAB0TX_ISR(void) RXData = UCB0RXBUF; _bic_SR_register_on_exit(CPUOFF); 例例3:TM1638的各個管腳功能說明:矩陣鍵盤的讀取矩陣鍵盤的讀取LED數(shù)碼管顯示數(shù)碼管顯示數(shù)數(shù) 碼碼 管管abcdefgDPag fCOMbce dCOMDPabcdefgDP發(fā)光字段,由管腳 a g 電平控制是否發(fā)光。小數(shù)點(diǎn),需要時才點(diǎn)亮。顯示的數(shù)字形式七段半導(dǎo)體數(shù)碼顯示器七段半導(dǎo)體數(shù)碼顯示器(LED) 數(shù)碼管結(jié)構(gòu)數(shù)碼管結(jié)構(gòu)abcdefghh g f e d c b a高電平共陰極h g f e d c b ah g f

17、e d c b aR8comD7 D6 D5 D4 D3 D2 D1 D0段碼字形碼段碼:為了顯示數(shù)字或字符,必須對數(shù)字或字符進(jìn)行編碼。七為了顯示數(shù)字或字符,必須對數(shù)字或字符進(jìn)行編碼。七段數(shù)碼管加上一個小數(shù)點(diǎn),共計段數(shù)碼管加上一個小數(shù)點(diǎn),共計8 8段段, ,因此為因此為LEDLED顯示器提供的顯示器提供的編碼正好是一個字節(jié)。編碼正好是一個字節(jié)。這些代碼通過各段的亮與滅來顯示不同字型的,因此稱之為段碼。共陰極D7 D6 D5 D4 D3 D2 D1 D0h g f e d c b ah g f e d c b ah g f e d c b a段碼與字形的關(guān)系段碼與字形的關(guān)系n 0 x3f , 0

18、 x06 , 0 x5b , 0 x4f , 0 x66 , 0 x6d ,n 0 1 2 3 4 5n 0 x7d , 0 x07 , 0 x7f , 0 x6f , 0 x77 , 0 x7c ,n 6 7 8 9 A Bn 0 x39 , 0 x5e , 0 x79 , 0 x71 , 0 x00n C D E F 無顯示+5Vh g f e d c b a共陽極共陽極comR8a b c d e f g h 某段為低電平時某段為低電平時 該段點(diǎn)亮發(fā)光該段點(diǎn)亮發(fā)光D7 D6 D5 D4 D3 D2 D1 D0段碼段碼共陽極段碼與字形的關(guān)系段碼與字形的關(guān)系n 0 xc0 , 0 xf9 ,

19、 0 xa4 , 0 xb0 , 0 x99 , 0 x92 ,n 0 1 2 3 4 5n 0 x82 , 0 xf8 , 0 x80 , 0 x90 , 0 x88 , 0 x83 ,n 6 7 8 9 A Bn 0 xc6 , 0 xa1 , 0 x86 , 0 x8e , 0 xffn C D E F 無顯示無顯示動態(tài)顯示的特點(diǎn):是將所有位數(shù)碼管的動態(tài)顯示的特點(diǎn):是將所有位數(shù)碼管的段選線并段選線并聯(lián)在一起聯(lián)在一起,由,由位選線控制是哪一位數(shù)碼管有效位選線控制是哪一位數(shù)碼管有效。當(dāng)需要顯示數(shù)字或字符時,將當(dāng)需要顯示數(shù)字或字符時,將,即動態(tài)掃描顯示。即動態(tài)掃描顯示。所謂動態(tài)掃描顯示:即所謂

20、動態(tài)掃描顯示:即,利用發(fā)光管的余輝和人眼視,利用發(fā)光管的余輝和人眼視覺暫留作用,使人的感覺好像各位數(shù)碼管同時都覺暫留作用,使人的感覺好像各位數(shù)碼管同時都在顯示。在顯示。圖圖 八位八位LED動態(tài)顯示器電路動態(tài)顯示器電路 I/O(1)DDDDDDDDI/O(2)75643210#include TM1638.hconst uint8_t tab2 = 0 x3F,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D,0 x07,0 x7F,0 x6F,0 x77,0 x7C,0 x39,0 x5E,0 x79,0 x71;void TM1638_Write(unsigned ch

21、ar DATA) /寫數(shù)據(jù)函數(shù)unsigned char i;P3DIR |= BIT5;for(i=0;i=1;unsigned char TM1638_Read(void) /讀數(shù)據(jù)函數(shù)unsigned char i;unsigned char temp=0;P3DIR &= BIT5;P3OUT &= BIT2;for(i=0;i=1; P3OUT &= BIT4; _delay_us(100); if(P3IN & BIT5) temp |= 0 x80; else temp &= 0 x7f; P3OUT |= BIT4;return temp

22、;void Write_COM(unsigned char cmd) /發(fā)送命令字P3OUT |= BIT4;P3OUT |= BIT2;P3OUT &= BIT2;TM1638_Write(cmd);P3OUT |= BIT2;unsigned char Read_key(void)unsigned char c4;unsigned int key_value=0 x00;unsigned int i;P3OUT |= BIT2;P3OUT &= BIT2;TM1638_Write(0 x42);_delay_us(1);for(i=0;i4;i+)ci=TM1638_Rea

23、d();P3OUT |= BIT2;if(c0&BIT2)key_value |= BIT1;else if(c0&BIT6)key_value |= BIT4;else if(c0&BIT0)key_value |= BIT2;else if(c0&BIT1)key_value |= BIT3;else if(c0&BIT5)key_value |= BIT6;else if(c0&BIT4)key_value |= BIT5;else if(c1&BIT0)key_value |= BITB;else if(c1&BIT4)k

24、ey_value |= BITC;else if(c2&BIT0)key_value |= BITD;else if(c2&BIT4)key_value |= BIT8;else if(c1&BIT1)key_value |= BITA;else if(c1&BIT5)key_value |= BITB;else if(c2&BIT5)key_value |= BIT9;else if(c2&BIT6)key_value |= BIT7;else if(c3&BIT0)key_value |= BITF;else if(c3&BI

25、T1)key_value |= BITE;else if(c3&BIT2)key_value |= BIT0;/特殊符號AC + - =else if(c1&BIT2)Write_allLED(0);/按下AC,清除所有顯示for(i=0;i16;i+)if(0 x01i)=key_value)break;returni;void Write_DATA(unsigned char add,unsigned char DATA) /指定地址寫入數(shù)據(jù)Write_COM(0 x44);P3OUT &= BIT2;TM1638_Write(0 xc0|add);TM1638_W

26、rite(DATA);P3OUT |= BIT2;void init_TM1638(void)unsigned char count = 0;unsigned char times = 16;while(times-) Write_allLED(tab2count);count+;if(count = 16)count = 0;_delay_ms(100);Write_allLED(0 xff);_delay_ms(100);Write_allLED(0);void Write_allLED(unsigned char DATA)unsigned char i;Write_COM(0 x8F)

27、;/顯示控制Write_COM(0 x40); /數(shù)據(jù)命令P3OUT &= BIT2;TM1638_Write(0 xc0);for(i=0;i16;i+) TM1638_Write(DATA);P3OUT |= BIT2;#ifndef _TM1638_H#define _TM1638_H#include msp430f6638.h#include #define CPU_F (double)20000000)#define _delay_us(x) _delay_cycles(long)(CPU_F*(double)x/1000000.0)#define _delay_ms(x)

28、_delay_cycles(long)(CPU_F*(double)x/1000.0)#define DIO_high(P3OUT |= BIT5)#define DIO_low(P3OUT &= BIT5)#define CLK_high(P3OUT |= BIT4)#define CLK_low(P3OUT &= BIT4)#define STB_high(P3OUT |= BIT2)#define STB_low(P3OUT &= BIT2)#define DIO_IN (P3DIR &= BIT5) /輸入狀態(tài)#define DIO_OUT (P3DIR |= BIT5) /輸出狀態(tài)#define DIO_READ (P3IN & BIT5) /讀引腳電平void TM1638_Write(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論