我编写了一些代码,应该遵循以下方案,使用I2C与传感器通信。
我预计示波器读数为下表中的内容:
| S | 1. | 1. | 0 | 0 | 0 | 0 | 0 | 宽 | 确认 | 0 | 0 | 0 | 0 | 1. | 0 | 0 | 0 | 确认 | S | 1. | 1. | 0 | 0 | 0 | 0 | 0 | R | 确认 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 确认/确认 |
P |
我得到的是图片上的内容:
我的理解是:
| S | 1. | 1. | 0 | 0 | 0 | 0 | 0 | 宽 | 确认 | 0 | 0 | 0 | 0 | 1. | 0 | 0 | 0 | 确认 | P | S | 1. | 1. | 0 | 0 | 0 | 0 | 0 | R | 确认 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 确认 | 1. | 1. | 1. | 1. | 1. | 1. | 1. |
问题/困惑的根源:
- 时钟保持低电平,在重置之前,无法再次使用总线
- 生成额外的时钟脉冲,但不发送停止
- 我用一个单独的I2C设备测试了这个错误,并遇到了同样的问题
我的代码如下所示:
#include "driverlib.h"
#define I2C_PINS gPIO_PORT_P3,gPIO_PIN6 + gPIO_PIN7
#define USI_MODULE EUSCI_B2_BASE
#define slaver_address 0b110万
#define prox_register 0x08
volatile uint16_t response = 0;
volatile uint8_t lsb = 0;
volatile uint8
I2I2I = 0;I2I配置= 0
EUSCI_B_I2C_CLOCKSOURCE_SMCLK, // SMCLK时钟源
300万, // SMCLK = 3MHz
EUSCI_B_I2C_SET_DATA_RATE_100KBPS, //所需的I2C时钟为100kHz
0, //无字节计数器阈值
EUSCI_B_I2C_NO_AUTO_STOP //无自动停止
};
int main(void){
WDT_A_HoldTimer();
GPIO_setAsPeripheralModuleFunctionInputPin (I2C_PINS,GPIO主要模块功能);
/*在100kHz的频率下将I2C主设备初始化到SMCLK,没有自动停止*/
I2C_initMaster(USCI_MODULE,&i2cConfig);
/*指定从属地址*/
I2C_setSlaveAddress (USI_MODULE,SLAVE_ADDRESS);
/*将主中继器设置为传输模式*/
I2C_setMode (USI_MODULE,EUSCI_B_I2C_Transmit_MODE);
/*启用I2C模块以启动操作*/
I2C_enableModule (USI_MODULE);
while (I2C_isBusBusy (USI_MODULE)== EUSCI_B_I2C_BUS_BUS_BUSY);
I2C_masterSendSingleByte (USI_MODULE,PROx_REGISTER);
I2C_masterReceiveStart (USI_MODULE);
LSB = I2C_masterReceiveMultiByteNext(USCI_MODULE);
MSB += I2C_masterReceiveMultiByteNext(USCI_MODULE);
I2C_masterReceiveMultiByteStop (USI_MODULE);
响应=(MSB <<8)|(lsb和0xff);
while (1);
}
如果有人能澄清出什么错的话,我将非常感谢。
谢谢!
基督教

