4236|4

2856

帖子

260

TA的资源

五彩晶圆(高级)

楼主
 

【TI首届低功耗设计大赛】+ 硬件I2C模块 [复制链接]

本帖最后由 ltbytyn 于 2014-11-30 23:50 编辑

在“【TI首届低功耗设计大赛】三轴加速度演示”中MSP430FR5969使用 IO模拟I2C驱动ADXL345三轴加速度芯片(使用IO模拟I2C的原因也在上文中说过)。事实上,MSP430FR5969本身有硬件的I2C模块。使用硬件I2C(eUSCI除了可配置为UART模式,还可配置为I2C模式工作,当然也可配置为SPI模式),不论效率、稳定性都是IO模拟无法比较的。I2c模块参数

I2C硬件框图

拓扑结构


数据发送

MSP430FR5969中硬件I2C模块支持7位和10位2种地址模式。
7位地址模式

10位地址模式




  1. #include "driverlib.h"

  2. //******************************************************************************
  3. //  Demo - EUSCI_B0 I2C Master TX bytes to Multiple Slaves
  4. //
  5. //  Description: This demo connects two MSP430's via the I2C bus.
  6. //  The master transmits to 4 different I2C slave addresses 0x0A,0x0B,0x0C&0x0D.
  7. //  Each slave address has a specific related data in the array TXData[].
  8. //  At the end of four I2C transactions the slave address rolls over and begins
  9. //  again at 0x0A.
  10. //  ACLK = n/a, MCLK = SMCLK = BRCLK = default DCO = ~1.045MHz
  11. //
  12. //                                /|\  /|\
  13. //                MSP430FR5969    10k  10k     MSP430FR5969
  14. //                   slave         |    |         master
  15. //             -----------------   |    |   -----------------
  16. //           -|XIN  P1.6/UCB0SDA|<-|----+->|P1.6/UCB0SDA  XIN|-
  17. //            |                 |  |       |                 |
  18. //           -|XOUT             |  |       |             XOUT|-
  19. //            |     P1.7/UCB0SCL|<-+------>|P1.7/UCB0SCL     |
  20. //            |                 |          |                 |
  21. //
  22. //******************************************************************************


  23. uint8_t TXData[] = { 0xA1, 0xB1, 0xC1, 0xD1 }; // Pointer to TX data
  24. uint8_t SlaveAddress[] = { 0x0A, 0x0B, 0x0C, 0x0D };
  25. uint8_t TXByteCtr;
  26. uint8_t SlaveFlag = 0;

  27. void main(void)
  28. {
  29.         WDT_A_hold(WDT_A_BASE);

  30.         //Set DCO frequency to 1MHz
  31.         CS_setDCOFreq(CS_DCORSEL_0, CS_DCOFSEL_0);
  32.         //Set ACLK = VLO with frequency divider of 1
  33.         CS_clockSignalInit(CS_ACLK, CS_VLOCLK_SELECT, CS_CLOCK_DIVIDER_1);
  34.         //Set SMCLK = DCO with frequency divider of 1
  35.         CS_clockSignalInit(CS_SMCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);
  36.         //Set MCLK = DCO with frequency divider of 1
  37.         CS_clockSignalInit(CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK_DIVIDER_1);

  38.         // Configure Pins for I2C
  39.         //Set P1.6 and P1.7 as Secondary Module Function Input.
  40.         /*

  41.          * Select Port 1
  42.          * Set Pin 6, 7 to input Secondary Module Function, (UCB0SIMO/UCB0SDA, UCB0SOMI/UCB0SCL).
  43.          */
  44.         GPIO_setAsPeripheralModuleFunctionInputPin(
  45.                 GPIO_PORT_P1,
  46.                 GPIO_PIN6 + GPIO_PIN7,
  47.                 GPIO_SECONDARY_MODULE_FUNCTION
  48.                 );

  49.         /*
  50.          * Disable the GPIO power-on default high-impedance mode to activate
  51.          * previously configured port settings
  52.          */
  53.         PMM_unlockLPM5();

  54.         EUSCI_B_I2C_masterInit(EUSCI_B0_BASE,
  55.                                EUSCI_B_I2C_CLOCKSOURCE_SMCLK,
  56.                                CS_getSMCLK(),
  57.                                EUSCI_B_I2C_SET_DATA_RATE_400KBPS,
  58.                                0,
  59.                                EUSCI_B_I2C_NO_AUTO_STOP
  60.                                );


  61.         //Set Master in receive mode
  62.         EUSCI_B_I2C_setMode(EUSCI_B0_BASE,
  63.                             EUSCI_B_I2C_TRANSMIT_MODE
  64.                             );
  65.         //Enable I2C Module to start operations
  66.         EUSCI_B_I2C_enable(EUSCI_B0_BASE);

  67.         EUSCI_B_I2C_clearInterruptFlag(EUSCI_B0_BASE,
  68.                                        EUSCI_B_I2C_TRANSMIT_INTERRUPT0 +
  69.                                        EUSCI_B_I2C_NAK_INTERRUPT
  70.                                        );

  71.         //Enable master Receive interrupt
  72.         EUSCI_B_I2C_enableInterrupt(EUSCI_B0_BASE,
  73.                                     EUSCI_B_I2C_TRANSMIT_INTERRUPT0 +
  74.                                     EUSCI_B_I2C_NAK_INTERRUPT
  75.                                     );

  76.         SlaveFlag = 0;
  77.         while (1) {
  78.                 //Specify slave address
  79.                 EUSCI_B_I2C_setSlaveAddress(EUSCI_B0_BASE,
  80.                                             SlaveAddress[SlaveFlag]
  81.                                             );

  82.                 TXByteCtr = 1;                  // Load TX byte counter

  83.                 while (EUSCI_B_I2C_SENDING_STOP == EUSCI_B_I2C_masterIsSTOPSent
  84.                                (EUSCI_B0_BASE)) ;


  85.                 EUSCI_B_I2C_masterSendStart(EUSCI_B0_BASE);

  86.                 __bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts
  87.                 // Remain in LPM0 until all data
  88.                 // is TX'd
  89.                 // Change Slave address
  90.                 SlaveFlag++;
  91.                 if (SlaveFlag > 3) {            // Roll over slave address
  92.                         SlaveFlag = 0;
  93.                         __delay_cycles(1000);   // Delay between transmissions
  94.                 }
  95.         }
  96. }

  97. #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
  98. #pragma vector=USCI_B0_VECTOR
  99. __interrupt
  100. #elif defined(__GNUC__)
  101. __attribute__((interrupt(USCI_B0_VECTOR)))
  102. #endif
  103. void USCIB0_ISR(void)
  104. {
  105.         switch (__even_in_range(UCB0IV, 0x1E)) {
  106.         case 0x00: break;                   // Vector 0: No interrupts break;
  107.         case 0x02: break;
  108.         case 0x04:
  109.                 EUSCI_B_I2C_masterSendStart(EUSCI_B0_BASE);
  110.                 break;                          // Vector 4: NACKIFG break;
  111.         case 0x06: break;                       // Vector 6: STTIFG break;
  112.         case 0x08: break;                       // Vector 8: STPIFG break;
  113.         case 0x0a: break;                       // Vector 10: RXIFG3 break;
  114.         case 0x0c: break;                       // Vector 14: TXIFG3 break;
  115.         case 0x0e: break;                       // Vector 16: RXIFG2 break;
  116.         case 0x10: break;                       // Vector 18: TXIFG2 break;
  117.         case 0x12: break;                       // Vector 20: RXIFG1 break;
  118.         case 0x14: break;                       // Vector 22: TXIFG1 break;
  119.         case 0x16: break;                       // Vector 24: RXIFG0 break;
  120.         case 0x18:
  121.                 if (TXByteCtr) {                // Check TX byte counter
  122.                         EUSCI_B_I2C_masterMultiByteSendNext(EUSCI_B0_BASE,
  123.                                                             TXData[SlaveFlag]);
  124.                         TXByteCtr--;            // Decrement TX byte counter
  125.                 }else  {
  126.                         EUSCI_B_I2C_masterMultiByteSendStop(EUSCI_B0_BASE);
  127.                         __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
  128.                 }
  129.                 break;                                          // Vector 26: TXIFG0 break;
  130.         default: break;
  131.         }
  132. }
复制代码




最新回复

  详情 回复 发表于 2014-12-1 12:57
 
点赞 关注(1)

回复
举报

106

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
进入LPM0后,如果有非IIC中断发生,程序就无法回到进入LPM0的地方,搞不懂。
 
 

回复

940

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
马克一下,有空好好研究一下,之前硬件IIC一直没有搞懂
 
 
 

回复

3416

帖子

0

TA的资源

纯净的硅(高级)

4
 
硬件IIC一直是很热门的话题啊,瞧瞧
 
个人签名

So TM what......?

 

 

回复

530

帖子

4

TA的资源

一粒金砂(高级)

5
 
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表