这是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;
}
Susan Yang:
在TivaWare的安装文件夹之内 ti\TivaWare_C_Series-2.1.4.178\driverlib 有I2C的驱动程序的,您可以参考一下
若是可以的话,请您附上波形
user5978058:
回复 Susan Yang:
我的代码已经使用了driverlib里面的IIC驱动程序,但是还是不行,不知你说的是不是example当中的IIC例程,我尝试过那几个例程,都不行
xyz549040622:
回复 user5978058:
SCL线的示波器是冲击波,无法用来通信,请问是什么原因?
你说的冲击波是什么意思呢?你驱动什么芯片呢?加上拉了没,贴波形上来看看。
user5978058:
回复 xyz549040622:
user5978058:
回复 xyz549040622:
是这样子的,然后我驱动MPU6050
xyz549040622:
回复 user5978058:
不应该呀,MPU6050有现成的驱动,直接就可以用的。波形太糟糕了。时钟的波形咋样。
请参考C:\ti\TivaWare_C_Series-2.1.4.178\sensorlib下mpu6050.c和mpu6050.h的代码。