MSP430I2C通信[行业荟萃]

上传人:汽*** 文档编号:578281240 上传时间:2024-08-23 格式:PPT 页数:45 大小:1.42MB
返回 下载 相关 举报
MSP430I2C通信[行业荟萃]_第1页
第1页 / 共45页
MSP430I2C通信[行业荟萃]_第2页
第2页 / 共45页
MSP430I2C通信[行业荟萃]_第3页
第3页 / 共45页
MSP430I2C通信[行业荟萃]_第4页
第4页 / 共45页
MSP430I2C通信[行业荟萃]_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《MSP430I2C通信[行业荟萃]》由会员分享,可在线阅读,更多相关《MSP430I2C通信[行业荟萃](45页珍藏版)》请在金锄头文库上搜索。

1、I2C通信通信内容提要内容提要I2C协议协议I2C通信通信I2C应用应用数码管和矩阵键盘数码管和矩阵键盘MSP430G2553引脚图引脚图I2C线与线与 两条总线:两条总线:串行时钟线串行时钟线SCL和串行数据线和串行数据线SDA 两条总线都被上拉电阻拉到VCC,线与输出。I2C协议的基本规范协议的基本规范 完整帧包括起始位、地址位、读写位、应答位、数据位 、数据位、应答位.数据位、应答位、停止位。从起始位开始每帧数据都是9位,其中第一帧是7位从机地址+1位读写标识+1位数据接收应答位;后续的每帧都是8位数据+1位数据接收方应答。R/W=0,主机发数据,ACK由从机负责拉低;反之如此。I2C协

2、议的起止位协议的起止位 81.1.在时钟线高电平时,数据线下降沿代表了起始位在时钟线高电平时,数据线下降沿代表了起始位STARTSTART2.2.在时钟线高电平时,数据线上升沿代表了停止位在时钟线高电平时,数据线上升沿代表了停止位STOPSTOP3.3.在时钟线高电平期间,数据线上的数据保持稳定在时钟线高电平期间,数据线上的数据保持稳定4.4.数据线上的数据只有当数据线上的数据只有当时钟线低电平期间时钟线低电平期间才能转换。才能转换。I2C的地址规范 7位地址模式位地址模式10位地址模式位地址模式I2CI2C的多主机仲裁的多主机仲裁小地址通信优先小地址通信优先仲裁过程中,多主机时钟实现仲裁过程

3、中,多主机时钟实现“线与线与”功能。功能。/|/|MSP430F6638100k100kMSP430F6638slave|master-|-|XINP8.5/UCB0SDA|P8.5/UCB0SDAXIN|-|XOUT|XOUT|-|P8.6/UCB0SCL|P8.6/UCB0SCL|主机在不停地发数据给从机,时钟为主机在不停地发数据给从机,时钟为1MHz1MHz例例1:#includeunsignedcharTXData;unsignedcharTXByteCtr;voidmain(void)WDTCTL=WDTPW+WDTHOLD;/StopWDTP8SEL|=BIT5+BIT6;/Ass

4、ignP8.5toUCB0SDAandUCB0SCLP8DIR|=BIT6;/P8.6toUCB0SCLUCB0CTL1=UCSSEL_2+UCSWRST;/UseSMCLK,keepSWresetUCB0CTL0=UCMST+UCMODE_3+UCSYNC;/I2CMaster,synchronousmodeUCB0BR0=10;UCB0BR1=0;UCB0I2CSA=0x48;/SlaveAddressis048hUCB0CTL1&=UCSWRST;/ClearSWreset,resumeoperationUCB0IE|=UCTXIE;/EnableTXinterruptTXData=0x

5、01;/HoldsTXdatawhile(1)TXByteCtr=1;/LoadTXbytecounterwhile(UCB0CTL1&UCTXSTP);/EnsurestopconditiongotsentUCB0CTL1|=UCTR+UCTXSTT;/I2CTX,startcondition_bis_SR_register(LPM0_bits+GIE);/EnterLPM0w/interruptsTXData+;/Incrementdatabyte主机主机#pragmavector=USCI_B0_VECTOR_interruptvoidUSCI_B0_ISR(void)switch(_e

6、ven_in_range(UCB0IV,12)case0:break;/Vector0:Nointerruptscase2:break;/Vector2:ALIFGcase4:break;/Vector4:NACKIFGcase6:break;/Vector6:STTIFGcase8:break;/Vector8:STPIFGcase10:break;/Vector10:RXIFGcase12:/Vector12:TXIFGif(TXByteCtr)/CheckTXbytecounterUCB0TXBUF=TXData;/LoadTXbufferTXByteCtr-;/DecrementTXb

7、ytecounterelseUCB0CTL1|=UCTXSTP;/I2CstopconditionUCB0IFG&=UCTXIFG;/ClearUSCI_B0TXintflag_bic_SR_register_on_exit(LPM0_bits);/ExitLPM0break;default:break;#includevolatileunsignedcharRXData;voidmain(void)WDTCTL=WDTPW+WDTHOLD;/StopWDTP8SEL|=BIT5+BIT6;/AssignP8.5/6toUCB0SDAandUCB0SCLUCB0CTL1|=UCSWRST;/E

8、nableSWresetUCB0CTL0=UCMODE_3+UCSYNC;/I2CSlave,synchronousmodeUCB0I2COA=0x32;/OwnAddressis032hUCB0CTL1&=UCSWRST;/ClearSWreset,resumeoperationUCB0IE|=UCRXIE;/EnableRXinterruptwhile(1)_bis_SR_register(LPM0_bits+GIE);/EnterLPM0,enableinterrupts从机从机#pragmavector=USCI_B0_VECTOR_interruptvoidUSCI_B0_ISR(v

9、oid)switch(_even_in_range(UCB0IV,12)case0:break;/Vector0:Nointerruptscase2:break;/Vector2:ALIFGcase4:break;/Vector4:NACKIFGcase6:break;/Vector6:STTIFGcase8:break;/Vector8:STPIFGcase10:/Vector10:RXIFGRXData=UCB0RXBUF;/GetRXdata_bic_SR_register_on_exit(LPM0_bits);/ExitLPM0break;case12:break;/Vector12:

10、TXIFGdefault:break; /| /| MSP430G2xx3 100k 100k MSP430G2xx3 slave | | master - | | - -|XIN P1.7/UCB0SDA |P1.7/UCB0SDA XIN|- | | | | -|XOUT | | XOUT|- | P1.6/UCB0SCL |P1.6/UCB0SCL | | | | |主机在不停地发数据给从机,时钟为主机在不停地发数据给从机,时钟为1MHz1MHz例例2:#include 主机主机unsigned char TXData;unsigned char TXByteCtr;int main(v

11、oid) WDTCTL = WDTPW + WDTHOLD; P1SEL |= BIT6 + BIT7; P1SEL2|= BIT6 + BIT7; UCB0CTL1 |= UCSWRST; UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; UCB0CTL1 = UCSSEL_2 ; UCB0BR0 = 10; UCB0BR1 = 0; UCB0I2CSA = 0x48; UCB0CTL1 &= UCSWRST; IE2 |= UCB0TXIE; TXData = 0x00; while (1) TXByteCtr = 1; while (UCB0CTL1 & UCT

12、XSTP); UCB0CTL1 |= UCTR + UCTXSTT; _bis_SR_register(CPUOFF + GIE); TXData+; #pragma vector = USCIAB0TX_VECTOR_interrupt void USCIAB0TX_ISR(void) if (TXByteCtr) / Check TX byte counter UCB0TXBUF = TXData; / Load TX buffer TXByteCtr-; / Decrement TX byte counter else UCB0CTL1 |= UCTXSTP; / I2C stop co

13、ndition IFG2 &= UCB0TXIFG; / Clear USCI_B0 TX int flag _bic_SR_register_on_exit(CPUOFF); / Exit LPM0 #include 从机从机volatile unsigned char RXData;int main(void) WDTCTL = WDTPW + WDTHOLD; P1SEL |= BIT6 + BIT7; P1SEL2|= BIT6 + BIT7; UCB0CTL1 |= UCSWRST; UCB0CTL0 = UCMODE_3 + UCSYNC; UCB0I2COA = 0x32; UC

14、B0CTL1 &= UCSWRST; IE2 |= UCB0RXIE; while (1) _bis_SR_register(CPUOFF + GIE); _no_operation(); #pragma vector = USCIAB0TX_VECTOR_interrupt void USCIAB0TX_ISR(void) RXData = UCB0RXBUF; _bic_SR_register_on_exit(CPUOFF); 例例3:符号管脚名称说明DIO数据输入/输出在时钟上升沿输入/输出串行数据,从低位开始;STB片选在上升沿或者下降沿初始化串行接口,随后等待接收指令。STB为低后的

15、第一个字节作为指令,当处理指令时,当前其它处理被终止。当STB为高时,CLK被忽略。CLK时钟输入上升沿输入/输出串行数据K1K3键扫描数据输入输入该脚的数据在显示周期结束后被锁存Seg1/ks1seg8/ks8输出段段输出(也用作键扫描),P管开漏输出Seg9seg10输出段段输出,P管开漏输出Grid1Grid8输出位位输出,N管开漏输出VDD逻辑电源5V10%GND逻辑地接地系统TM1638的各个管脚功能说明:矩阵键盘的读取矩阵键盘的读取LED数码管显示数码管显示数数 码码 管管abcdefgDPag fCOMbce dCOMDPabcdefgDP发光字段,由管脚a g 电平控制是否发光

16、。小数点,需要时才点亮。显示的数字形式七段半导体数码显示器七段半导体数码显示器(LED) 数码管结构数码管结构abcdefghh g f e d c b a高电平共阴极h g f e d c b ah g f e d c b aR8comD7 D6 D5 D4 D3 D2 D1 D0段码字形码段码:为了显示数字或字符,必须对数字或字符进行编码。七为了显示数字或字符,必须对数字或字符进行编码。七段数码管加上一个小数点,共计段数码管加上一个小数点,共计8 8段段, ,因此为因此为LEDLED显示器提供的显示器提供的编码正好是一个字节。编码正好是一个字节。这些代码通过各段的亮与灭来显示不同字型的,因

17、此称之为段码。共阴极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段段码与字形的关系与字形的关系n0x3f,0x06,0x5b,0x4f,0x66,0x6d,n012345n0x7d,0x07,0x7f,0x6f,0x77,0x7c,n6789ABn0x39,0x5e,0x79,0x71,0x00nCDEF 无显示+5Vh g f e d c b a共阳极共阳极comR8a b c d e f g h 某段某段为低低电平平时 该段点亮段点亮发光光D7 D6 D5 D4 D3 D2 D1 D0段段码共阳极段

18、段码与字形的关系与字形的关系n0xc0,0xf9,0xa4,0xb0,0x99,0x92,n012345n0x82,0xf8,0x80,0x90,0x88,0x83,n6789ABn0xc6,0xa1,0x86,0x8e,0xffnCDEF 无显示无显示动态显示动态显示 动态显示的特点:是将所有位数码管的动态显示的特点:是将所有位数码管的段选线段选线并联在一起并联在一起,由,由位选线控制是哪一位数码管有效位选线控制是哪一位数码管有效。当需要显示数字或字符时,将当需要显示数字或字符时,将数码管轮流点亮数码管轮流点亮数码管轮流点亮数码管轮流点亮,即动态扫描显示。即动态扫描显示。所谓动态扫描显示:即

19、所谓动态扫描显示:即轮流向各位数码管送出轮流向各位数码管送出轮流向各位数码管送出轮流向各位数码管送出字形码和相应的位选字形码和相应的位选字形码和相应的位选字形码和相应的位选,利用发光管的余辉和人眼,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时视觉暂留作用,使人的感觉好像各位数码管同时都在显示。都在显示。图图 八位八位LED动态显示器电路动态显示器电路 #includeTM1638.hconstuint8_ttab2=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71;

20、voidTM1638_Write(unsignedcharDATA)/写数据函数unsignedchari;P3DIR|=BIT5;for(i=0;i=1;unsignedcharTM1638_Read(void)/读数据函数unsignedchari;unsignedchartemp=0;P3DIR&=BIT5;P3OUT&=BIT2;for(i=0;i=1;P3OUT&=BIT4;_delay_us(100);if(P3IN&BIT5)temp|=0x80;elsetemp&=0x7f;P3OUT|=BIT4;returntemp;voidWrite_COM(unsignedcharcmd

21、)/发送命令字P3OUT|=BIT4;P3OUT|=BIT2;P3OUT&=BIT2;TM1638_Write(cmd);P3OUT|=BIT2;unsignedcharRead_key(void)unsignedcharc4;unsignedintkey_value=0x00;unsignedinti;P3OUT|=BIT2;P3OUT&=BIT2;TM1638_Write(0x42);_delay_us(1);for(i=0;i4;i+)ci=TM1638_Read();P3OUT|=BIT2;if(c0&BIT2)key_value|=BIT1;elseif(c0&BIT6)key_va

22、lue|=BIT4;elseif(c0&BIT0)key_value|=BIT2;elseif(c0&BIT1)key_value|=BIT3;elseif(c0&BIT5)key_value|=BIT6;elseif(c0&BIT4)key_value|=BIT5;elseif(c1&BIT0)key_value|=BITB;elseif(c1&BIT4)key_value|=BITC;elseif(c2&BIT0)key_value|=BITD;elseif(c2&BIT4)key_value|=BIT8;elseif(c1&BIT1)key_value|=BITA;elseif(c1&B

23、IT5)key_value|=BITB;elseif(c2&BIT5)key_value|=BIT9;elseif(c2&BIT6)key_value|=BIT7;elseif(c3&BIT0)key_value|=BITF;elseif(c3&BIT1)key_value|=BITE;elseif(c3&BIT2)key_value|=BIT0;/特殊符号AC+-=elseif(c1&BIT2)Write_allLED(0);/按下AC,清除所有显示for(i=0;i16;i+)if(0x01i)=key_value)break;returni;voidWrite_DATA(unsigned

24、charadd,unsignedcharDATA)/指定地址写入数据Write_COM(0x44);P3OUT&=BIT2;TM1638_Write(0xc0|add);TM1638_Write(DATA);P3OUT|=BIT2;voidinit_TM1638(void)unsignedcharcount=0;unsignedchartimes=16;while(times-)Write_allLED(tab2count);count+;if(count=16)count=0;_delay_ms(100);Write_allLED(0xff);_delay_ms(100);Write_all

25、LED(0);voidWrite_allLED(unsignedcharDATA)unsignedchari;Write_COM(0x8F);/显示控制Write_COM(0x40);/数据命令P3OUT&=BIT2;TM1638_Write(0xc0);for(i=0;i16;i+)TM1638_Write(DATA);P3OUT|=BIT2;#ifndef_TM1638_H#define_TM1638_H#includemsp430f6638.h#include#defineCPU_F(double)20000000)#define_delay_us(x)_delay_cycles(lon

26、g)(CPU_F*(double)x/1000000.0)#define_delay_ms(x)_delay_cycles(long)(CPU_F*(double)x/1000.0)#defineDIO_high(P3OUT|=BIT5)#defineDIO_low(P3OUT&=BIT5)#defineCLK_high(P3OUT|=BIT4)#defineCLK_low(P3OUT&=BIT4)#defineSTB_high(P3OUT|=BIT2)#defineSTB_low(P3OUT&=BIT2)#defineDIO_IN(P3DIR&=BIT5)/输入状态#defineDIO_OU

27、T(P3DIR|=BIT5)/输出状态#defineDIO_READ(P3IN&BIT5)/读引脚电平voidTM1638_Write(unsignedcharDATA);/写数据函数unsignedcharTM1638_Read(void);/读数据函数voidWrite_COM(unsignedcharcmd);/发送命令字unsignedcharRead_key(void);voidWrite_DATA(unsignedcharadd,unsignedcharDATA);/指定地址写入数据voidWrite_ALLDATA(unsignedcharadd,unsignedchar*p,u

28、nsignedcharcnt);voidWrite_oneLED(unsignedcharnum,unsignedcharflag);/单独控制一个LED函数,并且不影响其他的led状态,num为需要控制的led序号,voidWrite_allLED(unsignedcharflag);/控制全部LED函数,flag表示LED状态voidinit_TM1638(void);#endif参考程序代码参考程序代码#include TM1638.h#include msp430f6638.huint8_t num8; /各个数码管显示的值uint8_t led_flag8;const uint8_t

29、 tab = 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71;voidinit_port(void)P3DIR|=BIT5;P3DIR|=BIT4+BIT2;P1DIR|=BIT0;/ACLKsetouttopinsP1SEL|=BIT0;voidmain(void)unsignedinti=0;unsignedcharcount;WDTCTL=WDTPW+WDTHOLD;init_port();init_TM1638();while(1)i=Read_key();if(i0;count-)numcount=numcount-1;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库 > 总结/计划/报告

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号