器件型号: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);
返回;
}
