调试硬件IIC一直出不来,做IIC读写的时候用示波器看SCL脚没有时钟波形(同样的脚,使用软件IIC时是有波形的),代码如下,还望帮我看下问题所在:
void hw_iic_Init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIOPinConfigure(GPIO_PB2_I2C0SCL);
GPIOPinConfigure(GPIO_PB3_I2C0SDA);
GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_2 | GPIO_PIN_3);
GPIOPadConfigSet(GPIO_PORTB_BASE,GPIO_PIN_2,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_STD_WPU);
GPIOPadConfigSet(GPIO_PORTB_BASE,GPIO_PIN_3,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_OD); I2CMasterInitExpClk(I2C0_BASE, SysCtlClockGet(), false); //false:100kbps true:400kbps
I2CMasterEnable(I2C0_BASE);
}
void i2c_writebyte(uint8_t slave_addr,uint8_t reg_addr,uint8_t data)
{
I2CMasterSlaveAddrSet(I2C0_BASE, slave_addr, false);
I2CMasterDataPut(I2C0_BASE, reg_addr);
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
while(I2CMasterBusy(I2C0_BASE));
I2CMasterDataPut(I2C0_BASE, data);
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);
while(I2CMasterBusy(I2C0_BASE));
}
uint8_t i2c_readbyte(uint8_t slave_addr,uint8_t reg_addr)
{
uint8_t data;
I2CMasterSlaveAddrSet(I2C0_BASE, slave_addr, false);
I2CMasterDataPut(I2C0_BASE, reg_addr);
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START);
while(I2CMasterBusy(I2C0_BASE));
I2CMasterSlaveAddrSet(I2C0_BASE, slave_addr, true);
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
while(I2CMasterBusy(I2C0_BASE));
data = I2CMasterDataGet(I2C0_BASE);
return data;
}
Jin Zhang2:
把函数i2c_readbyte里面的 I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START); 换成
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_SEND);之后示波器能够看到时钟波形,但是读取到的数值一直是0xff
Jin Zhang2:
回复 Jin Zhang2:
向寄存器写入一个字节的函数也错误了,不能用I2C_MASTER_CMD_SINGLE_SEND,要用I2C_MASTER_CMD_BURST_SEND_START,否则发送的数据格式是错的
Disc George:
回复 Jin Zhang2:
学习了,多谢楼主~~
user5316406:
回复 Jin Zhang2:
你好 请问tm4的硬件IIC你那解决了吗 我现在用的硬件IIC读取20c02 数据 读出来一直0xff 写地址给0xa0,寄存器地址0x30 ,写入0x3c 读地址 0xa1 寄存器 0x30 读出一直是0xff
user5978058:
回复 Jin Zhang2:
请问为什么地址需要右移,是针对这个代码的配置才需要右移吗?
user5978058:
回复 Jin Zhang2:
burst是执行重复写入嘛,但写数据是不是应该用finished