请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:MSP430G2553 工具/软件:Code Composer Studio
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //库控制I2C USCI模块 //编写人:Pham van Thuan DTVT07-K55 //电子邮件:terran99.1992万@gmail.com //博客: http://thuanbk55.blogspot.com/ //................................................................. //用于MSP430 //************************************************************************************************** / #include <msp430g2553.h> #include <MSP430.h> #ifndef I2C_USI_H #define I2C_USI_H // Address #define MPU6050_address 0x68 #define BQ3.2万_address 0x68 #define DS1307_address 0x68 #define LM92_address 0x48 /************************************************************************************************************************************************************************************************************************************************. \ * 原型 * ******************** / void Byte_USI_Init(unsigned char addr);//Init Write void I2C_USI_Set_Address(unsigned char addr);//更改从属地址char I2C_USI_READ_Byte(unsigned char address);//读取1字节//读取多个unsigned char字节/u2I2C_USCH_Read_Word (unsigned char,unsigned char,unsigned char,unsigned char,dr,u2I2I2I,unsigned char,unsigned char,unsigned char,unsigned char,unsigned char,dr,d \ * 功能 * ******************** / void I2C_USI_Init(unsigned char addr){ P1SEL || BIT6 + BIT7; //将I2C引脚分配给USI_B0 P1SEL2|= BIT6 + BIT7; //将I2C引脚分配给USI_B0 UCB0CTL1 |= UCSWRST; //启用软件重置 UCB0CTL0 = UCMST+UCMODE_3+UCSYNC; // I2C主控,同步模式 UCB0CTL1 = UCSSEL_2+UCSSWRST; //使用SMCLK,保持软件重置 UCB0BR0 = 40; // fSCL = SMCLK/40 =~400kHz UCB0BR1 = 0; UCB0I2CSA =地址; //设置从属地址 UCB0CTL1 &=~UCSWRST; //清除SW复位,恢复操作 } void I2C_USI_Set_Address(unsigned char addr) { UCB0CTL1 |= UCSWRST; UCB0I2CSA =地址; //设置从属地址 UCB0CTL1 &=~UCSWRST; //清除软件重置,恢复操作 } unsigned char I2C_USI_READ_Byte (unsigned char address) { 同时(UCB0CTL1和UCTXSTP); UCB0CTL1 || UCTR + UCTXSTT; // I2C TX,START while (!(IFG2&UCB0TXIFG)); UCB0TXBUF =地址; while (!(IFG2&UCB0TXIFG)); UCB0CTL1 &=~UCTR; // I2C RX UCB0CTL1 || UCTXSTT; // I2C重新启动 IFG2 &=~UCB0TXIFG; 期间(UCB0CTL1和UCTXSTT); UCB0CTL1 || UCTXSTP; 返回UCB0RXBUF; } unsigned char I2C_USI_READ_Word (unsigned char Addr_Data,unsigned char *数据,unsigned char长度) { 无符号char i=0; 同时(UCB0CTL1和UCTXSTP); //循环直到I2C STT被发送 UCB0CTL1 || UCTR + UCTXSTT; // I2C TX,启动条件 while (!(IFG2&UCB0TXIFG)); IFG2 &=~UCB0TXIFG; //清除USI_B0 TX int标志 IF (UCB0STAT和UCNACKIFG) RETURN UCB0STAT; UCB0TXBUF =地址数据; while (!(IFG2&UCB0TXIFG)); IF (UCB0STAT和UCNACKIFG) RETURN UCB0STAT; UCB0CTL1 &=~UCTR; // I2C RX UCB0CTL1 || UCTXSTT; // I2C启动条件 IFG2 &=~UCB0TXIFG; //清除USI_B0 TX int标志 期间(UCB0CTL1和UCTXSTT); //循环直到I2C STT被发送 用于(i=0;i<(长度-1);i++) { 同时(!(IFG2和UCB0RXIFG)); IFG2 &=~UCB0TXIFG; //清除USI_B0 TX int标志 Data[i]= UCB0RXBUF; } 同时(!(IFG2和UCB0RXIFG)); IFG2 &=~UCB0TXIFG; //清除USI_B0 TX int标志 UCB0CTL1 || UCTXSTP; //第一个TX之后的I2C停止条件 Data[Length-1]= UCB0RXBUF; IFG2 &=~UCB0TXIFG; //清除USI_B0 TX int标志 返回0; } unsigned char I2C_USI_Write_Byte (unsigned char地址,unsigned char数据) { 同时(UCB0CTL1和UCTXSTP); UCB0CTL1 || UCTR + UCTXSTT; while (!(IFG2&UCB0TXIFG)); IF (UCB0STAT和UCNACKIFG) RETURN UCB0STAT; UCB0TXBUF =地址; while (!(IFG2&UCB0TXIFG)); IF (UCB0STAT和UCNACKIFG) RETURN UCB0STAT; UCB0TXBUF =数据; while (!(IFG2&UCB0TXIFG)); IF (UCB0STAT和UCNACKIFG) RETURN UCB0STAT; UCB0CTL1 || UCTXSTP; IFG2 &=~UCB0TXIFG; 返回0; } #endif /* I2C_USCI */
