器件型号:MSP432P401R
我尝试 将 DAC121C081与 msp432p401R 搭配使用。 但在调试模式下、while (I2C_isBusBusy (EUSCI_B3_base))处的软件桩模块;
int main(){ init_i2C_gpio(); I2C_init(); I2C_setSlave (0x0C); I2C_write16 (0x0、4096); } const eUSCI_I2C_MasterConfig i2cConfig = { EUSCI_B_I2C_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源 48000000、 // SMCLK = 48MHz EUSCI_B_I2C_SET_DATA_RATE 400KBPS、 //所需的100kHz I2C 时钟 0、 //无字节计数器阈值 EUSCI_B_I2C_NO_AUTO_STOP //无自动停止 }; void Init_I2C_GPIO() { /*为 I2C_SCL (P6.7)和 I2C_SDA (P6.6)选择 I2C 功能*/ GPIO_setPeripheralModuleFunctionOutputPin ( GPIO_PORT_P6、 GPIO_PIN7、 GPIO_PRIMARY_MODULE_FUNCTION); GPIO_setPeripheralModuleFunctionOutputPin ( GPIO_PORT_P6、 GPIO_PIN6、 GPIO_PRIMARY_MODULE_FUNCTION); } /************* //** *@brief 配置 I2C *@param none *@return none (无) / void I2C_init (void) { /*初始化 USCI_B3和 I2C 主设备以与从属设备通信*/ I2C_initMaster (EUSCI_B3_base、&i2cConfig); /*禁用 I2C 模块进行更改*/ I2C_DisableModule (USCI_B3_base); /*启用 I2C 模块以启动操作*/ I2C_enableModule (EUSCI_B3_base); 返回; } /************* //** *@简要从传感器读取数据 *@param writeByte 寄存器地址以读取 *@返回寄存器内容 / int I2C_read16 (unsigned char writeByte) { volatile int val = 0; volatile int valScratch = 0; /*将主设备设置为发送模式 PL */ I2C_setMode (EUSCI_B3_base、 EUSCI_B_I2C_Transmit 模式); /*清除任何现有的中断标志 PL */ I2C_clearInterruptFlag (EUSCI_B3_base、 EUSCI_B_I2C_Transmit INTERRUPT0); /*等待准备好写入 PL */ while (I2C_isBusBusy (EUSCI_B3_base)); /*启动开始并发送第一个字符*/ I2C_masterSendMultiByteStart (EUSCI_B3_base、writeByte); /*等待 TX 完成*/ while (!(I2C_getInterruptStatus (EUSCI_B3_base、 EUSCI_B_I2C_Transmit INTERRUPT0))); /*仅启动停止*/ I2C_masterSendMultiByteStop (EUSCI_B3_base); /*等待 Stop 完成*/ while (!I2C_getInterruptStatus (EUSCI_B3_base、 EUSCI_B_I2C_STOP_INTERRUPT)); /* *生成开始条件并将其设置为接收模式。 *这会发出从器件地址并继续读取 *直到您发出停止 * I2C_masterReceiveStart (EUSCI_B3_base); /*等待 RX 缓冲区填充*/ while (!(I2C_getInterruptStatus (EUSCI_B3_base、 EUSCI_B_I2C_Receive_INTERRUPT0))); /*从 I2C RX 寄存器读取*/ Val = I2C_masterReceiveMultiByteNext (EUSCI_B3_base); /*接收第二个字节、然后发送停止条件*/ valScratch = I2C_masterReceiveMultiByteFinish (EUSCI_B3_base); /*将 val 移动到顶部 MSB */ Val =(val << 8); /*从 I2C RX 寄存器读取并写入 val 的 LSB */ Val |= valScratch; /*返回温度值*/ 返回(int16_t) val; } /************* //** *@ @brief 将数据写入传感器*@param 指针要修改的寄存器地址*@param writeByte Data 要写入指定寄存器*返回任何一个都不返回 / void I2C_write16 (unsigned char 指针、unsigned int writeByte) { /*将主设备设置为发送模式 PL */ I2C_setMode (EUSCI_B3_base、 EUSCI_B_I2C_Transmit 模式); /*清除任何现有的中断标志 PL */ I2C_clearInterruptFlag (EUSCI_B3_base、 EUSCI_B_I2C_Transmit INTERRUPT0); /*等待准备好写入 PL */ while (I2C_isBusBusy (EUSCI_B3_base)); /*启动开始并发送第一个字符*/ I2C_masterSendMultiByteStart (EUSCI_B3_base、 指针); /*将 MSB 发送到传感器*/ I2C_masterSendMultiByteNext (EUSCI_B3_base、 (unsigned char)(writeByte>>8)); I2C_masterSendMultiByteFinish (EUSCI_B3_base、 (unsigned char)(writeByte&0xFF)); } void I2C_setslave (unsigned int slaveAddr) { /*指定 I2C 的从器件地址*/ I2C_setSlaveAddress (EUSCI_B3_base、 slaveAddr); /*启用和清除中断标志*/ I2C_clearInterruptFlag (EUSCI_B3_base、 EUSCI_B_I2C_Transmit INTERRUPT0 + EUSCI_B_I2C_Receive_INTERRUPT0); 返回; }