大家好、
我实际上有点困惑。 我尝试在 I2C 主模式下与未连接的器件通信。 由于某些测试方案、它未连接。
我使用以下代码:
#include <__cross_studio_io.h> #include //------------------------------------------------------------ //变量 int delay_counter = 0; //------------------------------------------ //主函数 void main (void){ // OSC WDTCTL = WDT_ADLY_1000; //看门狗计时器1000ms //IE1 = WDTIE; //启用看门狗中断 BCSCTL1 &=~XT2OFF; //启用振荡器 执行{ //外部时钟的延迟 IFG1 &=~OFIFG; 对于(DELAY_COUNTER = 0xFF;DELAY_COUNTER > 0;DELAY_COUNTER--); }while (((IFG1 & OFIFG)!= 0); BCSCTL2 = SELM_2 + SELS; //外部时钟(8MHz) //端口 // USART0 (I2C) P3SEL |=(BIT1 + BIT3); //外设选择 // I2C LEVELSHIFTER P4SEL &=~BIT1; // I/O 选择 P4DIR |= BIT1; // P4.1 I2C-LEVELSHIFTER 作为输出 // USART 0 U0CTL |= SWRST; //初始化 USART0状态机 U0CTL |= I2C + SYNC; USART0 U0CTL 上的// I2C 模式&=~I2CEN; //禁用 I2C // I2C I2CTCTL = I2CSSEL_1; // ACLK 时钟 I2CPSC = 0x00; //时钟预密封器/1 I2CSCLH = 0x0A; //移位时钟高电平 I2CSCLL = 0x0A; //移位时钟低电平 //预期: // ACLK = 32kHz // PRESCALED,其中/1 => 32kHz //高电平= 5 x (I2CPSC + 1)= 5 //低电平= 5 x (I2CPSC + 1)= 5 //完整周期:10 => 3.2kHz //测量值:250kHz I2CNDAT = 0; //初始化零字节 U0CTL |= I2CEN; //启用 I2C U0CTL |= MST; // MSP 的主模式 I2CIE |= TXRDYIE + ARDYIE; //中断使能 P4OUT |= BIT1; //默认情况下启用 I2C 电平转换器 // I2C 写入 while (I2CDCTL & I2CBB); I2CSA = 0x1A; //从器件地址 I2CNDAT = 0x01; //保存数据长度 U0CTL |= MST; //启用主控模式 I2CTCTL |= I2CTRx; //发送模式 I2CTCTL |= I2CSTT + I2CSTP; //起始条件和停止条件 while (1){}; } void I2C_ISR (void)__interrupt[USART0TX_vector]{ switch (I2CIV){ 案例8: //访问就绪中断 中断; 情况12: //发送就绪中断 I2CDRB = 0xAA; 中断; 默认值: 中断; }
我将在电路板上使用两个不同的振荡器。 一个在 X2IN (MCLK 和 SMCLK)上具有8MHz 频率、在 XIN (ACLK)上具有32.768Hz 振荡器。
我使用 I2CSSELx 选择的时钟源似乎无关紧要、结果始终保持不变。 I2C 总线上的第一个数据(器件地址)的时钟频率为250kHz。
是否有人可以确认这种行为、并告诉我如何更改它以便与较慢的时钟一起使用?