SDK例程解析-IIC模块-例程01

[复制链接]

73

主题

469

帖子

1005

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1005
查看: 4285回复: 3 发表于 2019-11-23 21:44:46   只看该作者
SDK例程解析,源码与SDK有所改动,请参考帖子中的源码进行实验。

例程描述,请参考下边的图片;
SDK例程IIC-例程01.png


主机端的代码:
  1. /*******************************************************************************
  2. *  MSP432 I2C - EUSCI_B0_BASE主机发送多个数据到从机
  3. *
  4. *  描述:
  5. *  两个MSP432通过IIC总线进行连接。主机发送数据到从机。
  6. *
  7. *  该例程是主机部分的代码。
  8. *  IIC主机采用中断的方式连续发送数据。
  9. *
  10. *  ACLK = n/a, MCLK = HSMCLK = SMCLK = BRCLK = default DCO = ~3.0MHz
  11. *
  12. ******************************************************************************/

  13. //库函数头文件包含
  14. #include <ti/devices/msp432p4xx/driverlib/driverlib.h>

  15. //标准头文件
  16. #include <stdint.h>
  17. #include <stdbool.h>

  18. //从机地址定义
  19. #define SLAVE_ADDRESS 0x48

  20. //变量定义
  21. static uint8_t TXData = 0;
  22. static uint8_t TXByteCtr;

  23. //主机的IIC参数配置,速率选择(100KBPS, 400KBPS)
  24. const eUSCI_I2C_MasterConfig i2cConfig =
  25. {
  26.      EUSCI_B_I2C_CLOCKSOURCE_SMCLK,          // 选择时钟源SMCLK
  27.      3000000,                                // SMCLK的频率是3MHz (默认)
  28.      EUSCI_B_I2C_SET_DATA_RATE_400KBPS,      // 设置I2C时钟速率为400khz
  29.      0,                                      // 不使用字节计数阈值
  30.      EUSCI_B_I2C_NO_AUTO_STOP                // 不自动产生STOP
  31. };

  32. int main(void)
  33. {
  34.     volatile uint32_t ii;

  35.     //停用看门狗
  36.     MAP_WDT_A_holdTimer();

  37.     //P1.0用作运行指示灯
  38.     MAP_GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
  39.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0);

  40. //选择P1.6和P1.7用作功能引脚,IIC接口.
  41.     MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1,
  42.             GPIO_PIN6 + GPIO_PIN7, GPIO_PRIMARY_MODULE_FUNCTION);

  43.     //IIC配置成主机,具体参数在i2cConfig中定义
  44.     MAP_I2C_initMaster(EUSCI_B0_BASE, &i2cConfig);

  45.     //配置从机通讯地址
  46.     MAP_I2C_setSlaveAddress(EUSCI_B0_BASE, SLAVE_ADDRESS);

  47.     //配置主机处于发送模式
  48.     MAP_I2C_setMode(EUSCI_B0_BASE, EUSCI_B_I2C_TRANSMIT_MODE);

  49.     //使能I2C模块
  50.     MAP_I2C_enableModule(EUSCI_B0_BASE);
  51.    
  52.     //清除中断标志,使能中断
  53.     MAP_I2C_clearInterruptFlag(EUSCI_B0_BASE,EUSCI_B_I2C_TRANSMIT_INTERRUPT0 + EUSCI_B_I2C_NAK_INTERRUPT);
  54.     MAP_I2C_enableInterrupt(EUSCI_B0_BASE,EUSCI_B_I2C_TRANSMIT_INTERRUPT0 + EUSCI_B_I2C_NAK_INTERRUPT);
  55.     MAP_Interrupt_enableInterrupt(INT_EUSCIB0);
  56.    
  57.     //开启全局中断
  58.     MAP_Interrupt_enableMaster();

  59.     while (1)
  60.     {
  61.         //两次发送之间的延时等待
  62.         for (ii = 0; ii < 40000; ii++);
  63.         for (ii = 0; ii < 40000; ii++);

  64.         //程序运行指示灯
  65.         MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);

  66.         //字节计数
  67.         TXByteCtr = 4;
  68.         TXData = 0;

  69.         //确保上一次的发送数据已经完成
  70.         while (MAP_I2C_masterIsStopSent(EUSCI_B0_BASE) == EUSCI_B_I2C_SENDING_STOP);

  71. //主机发送起始条件START+地址
  72.         //--如果从机发送应答ACK,UCTXSTT=0,UCTXIFG=1
  73.         //--如果从机发送无应答NACK,UCTXSTT=0,UCNACKIFG=1
  74.         MAP_I2C_masterSendStart(EUSCI_B0_BASE);

  75. //        MAP_Interrupt_enableSleepOnIsrExit();
  76. //        MAP_PCM_gotoLPM0InterruptSafe();
  77.     }
  78. }

  79. /*******************************************************************************
  80. * USCIAB0TX_ISR中断服务程序
  81. *
  82. * TXByteCtr用来表示发送的数据数量;
  83. * TXData表示要发送的数据
  84. ******************************************************************************/
  85. void EUSCIB0_IRQHandler(void)
  86. {
  87.     uint_fas**_t status;

  88.     status = MAP_I2C_getEnabledInterruptStatus(EUSCI_B0_BASE);
  89.     MAP_I2C_clearInterruptFlag(EUSCI_B0_BASE, status);

  90.     //如果收到从机的无应答NACK,UCNACKIFG=1
  91.     if (status & EUSCI_B_I2C_NAK_INTERRUPT)
  92.     {
  93.         //主机发送起始信号START
  94.         MAP_I2C_masterSendStart(EUSCI_B0_BASE);
  95.     }

  96.     //如果收到从机的应答ACK,UCTXIFG=1
  97.     if (status & EUSCI_B_I2C_TRANSMIT_INTERRUPT0)
  98.     {
  99.         //判断发送的字节计数
  100.         //TXByteCtr:(4),3,2,1
  101.         //TXData   :(0),1,2,3
  102.         if (TXByteCtr)
  103.         {
  104.             //发送下一个数据,并且计数减一
  105.             MAP_I2C_masterSendMultiByteNext(EUSCI_B0_BASE, TXData++);
  106.             TXByteCtr--;
  107.         }
  108.         else
  109.         {
  110.             //发送停止信号STOP
  111.             MAP_I2C_masterSendMultiByteStop(EUSCI_B0_BASE);
  112. //            MAP_Interrupt_disableSleepOnIsrExit();
  113.         }
  114.     }
  115. }
复制代码


从机端的代码:
  1. /*******************************************************************************
  2. *  MSP432 I2C - EUSCI_B0_BASE从机接收主机发送的多个数据
  3. *
  4. *  描述:
  5. *  两个MSP432通过IIC总线进行连接。主机发送数据到从机。
  6. *
  7. *  该例程是从机部分的代码。
  8. *  利用中断USCI_B0 RX接收数据;数据存储在数组RXData中;
  9. *
  10. *
  11. ******************************************************************************/

  12. //库函数头文件包含
  13. #include <ti/devices/msp432p4xx/driverlib/driverlib.h>

  14. //标准头文件
  15. #include <stdint.h>
  16. #include <stdbool.h>

  17. //例程相关的定义
  18. #define SLAVE_ADDRESS       0x48
  19. #define NUM_OF_RX_BYTES     4

  20. //变量定义
  21. static volatile uint8_t RXData[NUM_OF_RX_BYTES];
  22. static volatile uint32_t xferIndex;

  23. int main(void)
  24. {
  25.     //停用看门狗
  26.     MAP_WDT_A_holdTimer();

  27.     xferIndex = 0;

  28.     //P1.0正确接收预期数据的指示灯
  29.     MAP_GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
  30.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
  31.     //P2.1接收的数据不符合预期的指示灯
  32.     MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN1);
  33.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);

  34.     //选择P1.6和P1.7用作功能引脚,IIC接口
  35.     MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1,
  36.             GPIO_PIN6 + GPIO_PIN7, GPIO_PRIMARY_MODULE_FUNCTION);

  37.     //eUSCI I2C从机配置
  38.     MAP_I2C_initSlave(EUSCI_B0_BASE, SLAVE_ADDRESS, EUSCI_B_I2C_OWN_ADDRESS_OFFSET0,
  39.                       EUSCI_B_I2C_OWN_ADDRESS_ENABLE);

  40.     //I2C从机设置成接收模式
  41.     MAP_I2C_setMode(EUSCI_B0_BASE, EUSCI_B_I2C_RECEIVE_MODE);

  42.     //使能eUSCI模块
  43.     MAP_I2C_enableModule(EUSCI_B0_BASE);
  44.     //清除中断标志位,使能接收中断,使能模块中断
  45.     MAP_I2C_clearInterruptFlag(EUSCI_B0_BASE, EUSCI_B_I2C_RECEIVE_INTERRUPT0);
  46.     MAP_I2C_enableInterrupt(EUSCI_B0_BASE, EUSCI_B_I2C_RECEIVE_INTERRUPT0);
  47.     MAP_Interrupt_enableSleepOnIsrExit();
  48.     MAP_Interrupt_enableInterrupt(INT_EUSCIB0);
  49.     //开启全局中断
  50.     MAP_Interrupt_enableMaster();

  51.     //进入低功耗模式
  52.     while (1)
  53.     {
  54.         MAP_PCM_gotoLPM0();
  55.     }
  56. }

  57. /******************************************************************************
  58. * eUSCI_B0中断处理函数
  59. * 处理iic模块接收到的数据,存放到数组中
  60. ******************************************************************************/
  61. void EUSCIB0_IRQHandler(void)
  62. {
  63.     uint_fas**_t status;

  64.     status = MAP_I2C_getEnabledInterruptStatus(EUSCI_B0_BASE);
  65.     MAP_I2C_clearInterruptFlag(EUSCI_B0_BASE, status);

  66.     //判断接收中断标志RXIFG
  67.     //RXBUF收到数据时,RXIFG会自动置1
  68.     if (status & EUSCI_B_I2C_RECEIVE_INTERRUPT0)
  69.     {
  70.         //读取RXBUF当中的数据
  71.         RXData[xferIndex] = MAP_I2C_slaveGetData(EUSCI_B0_BASE);
  72.         //数组下标+1
  73.         xferIndex++;
  74.         //判断数组下标,如果已经是最大值,清零;
  75.         //例如NUM_OF_RX_BYTES=4, xferIndex的取值为0,1,2,3
  76.         if (xferIndex == NUM_OF_RX_BYTES)
  77.         {
  78.             xferIndex = 0;//此处设置断点

  79.             //对接收到的数据进行判断,看下是否符合预期
  80.             if((RXData[0]==0x00)&&(RXData[1]==0x01)&&(RXData[2]==0x02)&&(RXData[3]==0x03))
  81.             {
  82.                 //正确接收到预期的数据,红灯闪烁
  83.                 MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);
  84.             }
  85.             else
  86.             {
  87.                //接收的数据不符合预期,绿灯闪烁
  88.                 MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN1);
  89.             }
  90.         }
  91.     }
  92. }
复制代码



45

主题

179

帖子

454

积分

二氧化硅

Rank: 2

积分
454
发表于 2019-11-26 08:50:35   只看该作者
谢谢 谢谢

150

主题

445

帖子

1900

积分

审核员

Rank: 9Rank: 9Rank: 9

积分
1900
发表于 2019-12-5 14:54:49   只看该作者
谢谢分享

41

主题

160

帖子

332

积分

二氧化硅

Rank: 2

积分
332
发表于 2020-2-28 08:56:54   只看该作者
谢谢分享
快速回复 返回顶部 返回列表