This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TM4C 123GXL的IIC模块用示波器看SCL是间隔很宽的冲击波,请问是什么原因?

这是IIC的初始化代码和向外设中特定寄存器中读写数据的函数,但是SCL线的示波器是冲击波,无法用来通信,请问是什么原因?

void IIC0_Init(void)
{

uint8_t result;
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);//初始化i2c模块
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使用I2C模块0,引脚配置为I2C0SCL--PB2、I2C0SDA--PB3
GPIOPinConfigure(GPIO_PB2_I2C0SCL);//配置PB2为I2C0SCL
GPIOPinConfigure(GPIO_PB3_I2C0SDA);//配置PB3为I2C0SDA
GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_2);//I2C将GPIO_PIN_2用作SCL
GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_3);//I2C将GPIO_PIN_3用作SDA


I2CMasterInitExpClk(I2C0_BASE,16000000, true); //config I2C0 400k
I2CMasterEnable(I2C0_BASE);


}

uint8_t Single_WriteI2C(uint8_t REG_Address,uint8_t REG_data)
{
uint8_t rop;
while(I2CMasterBusy(I2C0_BASE)){};//如果I2C0模块忙,等待
//
I2CMasterSlaveAddrSet(I2C0_BASE, SlaveAddress, false);
//设置主机要放到总线上的从机地址。false表示主机写从机,true表示主机读从机

I2CMasterDataPut(I2C0_BASE, REG_Address);//主机写设备寄存器地址
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);//执行重复写入操作
while(I2CMasterBusy(I2C0_BASE)){};

rop = (uint8_t)I2CMasterErr(I2C0_BASE);//调试用

I2CMasterDataPut(I2C0_BASE, REG_data);
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);//执行重复写入操作并结束
while(I2CMasterBusy(I2C0_BASE)){};

rop = (uint8_t)I2CMasterErr(I2C0_BASE);//调试用

return rop;//返回错误类型,无错返回0
}

uint8_t Single_ReadI2C(uint8_t REG_Address)
{
uint8_t value,rop;
while(I2CMasterBusy(I2C0_BASE)){};
I2CMasterSlaveAddrSet(I2C0_BASE, SlaveAddress, false);
I2CMasterDataPut(I2C0_BASE, REG_Address);
// I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);
I2CMasterControl(I2C0_BASE,I2C_MASTER_CMD_SINGLE_SEND);//执行单次写入操作
while(I2CMasterBusBusy(I2C0_BASE));
rop = (uint8_t)I2CMasterErr(I2C0_BASE);
Delay(130);
//receive data
I2CMasterSlaveAddrSet(I2C0_BASE, SlaveAddress, true);//设置从机地址
I2CMasterControl(I2C0_BASE,I2C_MASTER_CMD_SINGLE_RECEIVE);//执行单次读操作
while(I2CMasterBusBusy(I2C0_BASE));
value=I2CMasterDataGet(I2C0_BASE);//获取读取的数据
Delay(130);
return value;

}