MSP430I2C通信_第1页
MSP430I2C通信_第2页
MSP430I2C通信_第3页
MSP430I2C通信_第4页
MSP430I2C通信_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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、中,多主机时钟实现“线与线与”功能。功能。 /| /| MSP430F6638 100k 100k MSP430F6638 slave | | master - | | - |XIN P8.5/UCB0SDA| |P8.5/UCB0SDA XIN|- | | | | | |XOUT | | | XOUT|- | P8.6/UCB0SCL|P8.6/UCB0SCL | | | | |主机在不停地发数据给从机,时钟为主机在不停地发数据给从机,时钟为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 主机主机#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 从机从机#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 | | | | |主机在不停地发数据给从机,时钟为主机在不停地发数据给从机,时钟为1MHz1MHz例例2:#include 主机主机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 从机从机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数码管显示数码管显示数数 码码 管管abcdefgDPag fCOMbce dCOMDPabcdefgDP发光字段,由管脚 a g 电平控制是否发光。小数点,需要时才点亮。显示的数字形式七段半导体数码显示器七段半导体数码显示器(LED) 数码管结构数码管结构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段码字形码段码:为了显示数字或字符,必须对数字或字符进行编码。七为了显示数字或字符,必须对数字或字符进行编码。七段数码管加上一个小数点,共计段数码管加上一个小数点,共计8 8段段, ,因此为因此为LEDLED显示器提供的显示器提供的编码正好是一个字节。编码正好是一个字节。这些代码通过各段的亮与灭来显示不同字型的,因此称之为段码。共阴极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段码与字形的关系段码与字形的关系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 某段为低电平时某段为低电平时 该段点亮发光该段点亮发光D7 D6 D5 D4 D3 D2 D1 D0段码段码共阳极段码与字形的关系段码与字形的关系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 无显示无显示动态显示的特点:是将所有位数码管的动态显示的特点:是将所有位数码管的段选线并段选线并联在一起联在一起,由,由位选线控制是哪一位数码管有效位选线控制是哪一位数码管有效。当需要显示数字或字符时,将当需要显示数字或字符时,将,即动态扫描显示。即动态扫描显示。所谓动态扫描显示:即所谓

20、动态扫描显示:即,利用发光管的余辉和人眼视,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都觉暂留作用,使人的感觉好像各位数码管同时都在显示。在显示。图图 八位八位LED动态显示器电路动态显示器电路 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) /写数据函数unsigned char i;P3DIR |= BIT5;for(i=0;i=1;unsigned char TM1638_Read(void) /读数据函数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) /发送命令字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) /指定地址写入数据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); /数据命令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) /输入状态#define DIO_OUT (P3DIR |= BIT5) /输出状态#define DIO_READ (P3IN & BIT5) /读引脚电平void TM1638_Write(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论