|
楼主
查看: 5872回复: 3
发表于 2019-11-23 21:44:46
只看该作者
SDK例程解析,源码与SDK有所改动,请参考帖子中的源码进行实验。
例程描述,请参考下边的图片;
主机端的代码:
- /*******************************************************************************
- * MSP432 I2C - EUSCI_B0_BASE主机发送多个数据到从机
- *
- * 描述:
- * 两个MSP432通过IIC总线进行连接。主机发送数据到从机。
- *
- * 该例程是主机部分的代码。
- * IIC主机采用中断的方式连续发送数据。
- *
- * ACLK = n/a, MCLK = HSMCLK = SMCLK = BRCLK = default DCO = ~3.0MHz
- *
- ******************************************************************************/
- //库函数头文件包含
- #include <ti/devices/msp432p4xx/driverlib/driverlib.h>
- //标准头文件
- #include <stdint.h>
- #include <stdbool.h>
- //从机地址定义
- #define SLAVE_ADDRESS 0x48
- //变量定义
- static uint8_t TXData = 0;
- static uint8_t TXByteCtr;
- //主机的IIC参数配置,速率选择(100KBPS, 400KBPS)
- const eUSCI_I2C_MasterConfig i2cConfig =
- {
- EUSCI_B_I2C_CLOCKSOURCE_SMCLK, // 选择时钟源SMCLK
- 3000000, // SMCLK的频率是3MHz (默认)
- EUSCI_B_I2C_SET_DATA_RATE_400KBPS, // 设置I2C时钟速率为400khz
- 0, // 不使用字节计数阈值
- EUSCI_B_I2C_NO_AUTO_STOP // 不自动产生STOP
- };
- int main(void)
- {
- volatile uint32_t ii;
- //停用看门狗
- MAP_WDT_A_holdTimer();
- //P1.0用作运行指示灯
- MAP_GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
- MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0);
- //选择P1.6和P1.7用作功能引脚,IIC接口.
- MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1,
- GPIO_PIN6 + GPIO_PIN7, GPIO_PRIMARY_MODULE_FUNCTION);
- //IIC配置成主机,具体参数在i2cConfig中定义
- MAP_I2C_initMaster(EUSCI_B0_BASE, &i2cConfig);
- //配置从机通讯地址
- MAP_I2C_setSlaveAddress(EUSCI_B0_BASE, SLAVE_ADDRESS);
- //配置主机处于发送模式
- MAP_I2C_setMode(EUSCI_B0_BASE, EUSCI_B_I2C_TRANSMIT_MODE);
- //使能I2C模块
- MAP_I2C_enableModule(EUSCI_B0_BASE);
-
- //清除中断标志,使能中断
- MAP_I2C_clearInterruptFlag(EUSCI_B0_BASE,EUSCI_B_I2C_TRANSMIT_INTERRUPT0 + EUSCI_B_I2C_NAK_INTERRUPT);
- MAP_I2C_enableInterrupt(EUSCI_B0_BASE,EUSCI_B_I2C_TRANSMIT_INTERRUPT0 + EUSCI_B_I2C_NAK_INTERRUPT);
- MAP_Interrupt_enableInterrupt(INT_EUSCIB0);
-
- //开启全局中断
- MAP_Interrupt_enableMaster();
- while (1)
- {
- //两次发送之间的延时等待
- for (ii = 0; ii < 40000; ii++);
- for (ii = 0; ii < 40000; ii++);
- //程序运行指示灯
- MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);
- //字节计数
- TXByteCtr = 4;
- TXData = 0;
- //确保上一次的发送数据已经完成
- while (MAP_I2C_masterIsStopSent(EUSCI_B0_BASE) == EUSCI_B_I2C_SENDING_STOP);
- //主机发送起始条件START+地址
- //--如果从机发送应答ACK,UCTXSTT=0,UCTXIFG=1
- //--如果从机发送无应答NACK,UCTXSTT=0,UCNACKIFG=1
- MAP_I2C_masterSendStart(EUSCI_B0_BASE);
- // MAP_Interrupt_enableSleepOnIsrExit();
- // MAP_PCM_gotoLPM0InterruptSafe();
- }
- }
- /*******************************************************************************
- * USCIAB0TX_ISR中断服务程序
- *
- * TXByteCtr用来表示发送的数据数量;
- * TXData表示要发送的数据
- ******************************************************************************/
- void EUSCIB0_IRQHandler(void)
- {
- uint_fas**_t status;
- status = MAP_I2C_getEnabledInterruptStatus(EUSCI_B0_BASE);
- MAP_I2C_clearInterruptFlag(EUSCI_B0_BASE, status);
- //如果收到从机的无应答NACK,UCNACKIFG=1
- if (status & EUSCI_B_I2C_NAK_INTERRUPT)
- {
- //主机发送起始信号START
- MAP_I2C_masterSendStart(EUSCI_B0_BASE);
- }
- //如果收到从机的应答ACK,UCTXIFG=1
- if (status & EUSCI_B_I2C_TRANSMIT_INTERRUPT0)
- {
- //判断发送的字节计数
- //TXByteCtr:(4),3,2,1
- //TXData :(0),1,2,3
- if (TXByteCtr)
- {
- //发送下一个数据,并且计数减一
- MAP_I2C_masterSendMultiByteNext(EUSCI_B0_BASE, TXData++);
- TXByteCtr--;
- }
- else
- {
- //发送停止信号STOP
- MAP_I2C_masterSendMultiByteStop(EUSCI_B0_BASE);
- // MAP_Interrupt_disableSleepOnIsrExit();
- }
- }
- }
复制代码
从机端的代码:
- /*******************************************************************************
- * MSP432 I2C - EUSCI_B0_BASE从机接收主机发送的多个数据
- *
- * 描述:
- * 两个MSP432通过IIC总线进行连接。主机发送数据到从机。
- *
- * 该例程是从机部分的代码。
- * 利用中断USCI_B0 RX接收数据;数据存储在数组RXData中;
- *
- *
- ******************************************************************************/
- //库函数头文件包含
- #include <ti/devices/msp432p4xx/driverlib/driverlib.h>
- //标准头文件
- #include <stdint.h>
- #include <stdbool.h>
- //例程相关的定义
- #define SLAVE_ADDRESS 0x48
- #define NUM_OF_RX_BYTES 4
- //变量定义
- static volatile uint8_t RXData[NUM_OF_RX_BYTES];
- static volatile uint32_t xferIndex;
- int main(void)
- {
- //停用看门狗
- MAP_WDT_A_holdTimer();
- xferIndex = 0;
- //P1.0正确接收预期数据的指示灯
- MAP_GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
- MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
- //P2.1接收的数据不符合预期的指示灯
- MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN1);
- MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
- //选择P1.6和P1.7用作功能引脚,IIC接口
- MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1,
- GPIO_PIN6 + GPIO_PIN7, GPIO_PRIMARY_MODULE_FUNCTION);
- //eUSCI I2C从机配置
- MAP_I2C_initSlave(EUSCI_B0_BASE, SLAVE_ADDRESS, EUSCI_B_I2C_OWN_ADDRESS_OFFSET0,
- EUSCI_B_I2C_OWN_ADDRESS_ENABLE);
- //I2C从机设置成接收模式
- MAP_I2C_setMode(EUSCI_B0_BASE, EUSCI_B_I2C_RECEIVE_MODE);
- //使能eUSCI模块
- MAP_I2C_enableModule(EUSCI_B0_BASE);
- //清除中断标志位,使能接收中断,使能模块中断
- MAP_I2C_clearInterruptFlag(EUSCI_B0_BASE, EUSCI_B_I2C_RECEIVE_INTERRUPT0);
- MAP_I2C_enableInterrupt(EUSCI_B0_BASE, EUSCI_B_I2C_RECEIVE_INTERRUPT0);
- MAP_Interrupt_enableSleepOnIsrExit();
- MAP_Interrupt_enableInterrupt(INT_EUSCIB0);
- //开启全局中断
- MAP_Interrupt_enableMaster();
- //进入低功耗模式
- while (1)
- {
- MAP_PCM_gotoLPM0();
- }
- }
- /******************************************************************************
- * eUSCI_B0中断处理函数
- * 处理iic模块接收到的数据,存放到数组中
- ******************************************************************************/
- void EUSCIB0_IRQHandler(void)
- {
- uint_fas**_t status;
- status = MAP_I2C_getEnabledInterruptStatus(EUSCI_B0_BASE);
- MAP_I2C_clearInterruptFlag(EUSCI_B0_BASE, status);
- //判断接收中断标志RXIFG
- //RXBUF收到数据时,RXIFG会自动置1
- if (status & EUSCI_B_I2C_RECEIVE_INTERRUPT0)
- {
- //读取RXBUF当中的数据
- RXData[xferIndex] = MAP_I2C_slaveGetData(EUSCI_B0_BASE);
- //数组下标+1
- xferIndex++;
- //判断数组下标,如果已经是最大值,清零;
- //例如NUM_OF_RX_BYTES=4, xferIndex的取值为0,1,2,3
- if (xferIndex == NUM_OF_RX_BYTES)
- {
- xferIndex = 0;//此处设置断点
- //对接收到的数据进行判断,看下是否符合预期
- if((RXData[0]==0x00)&&(RXData[1]==0x01)&&(RXData[2]==0x02)&&(RXData[3]==0x03))
- {
- //正确接收到预期的数据,红灯闪烁
- MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);
- }
- else
- {
- //接收的数据不符合预期,绿灯闪烁
- MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN1);
- }
- }
- }
- }
复制代码
|
|