TI中文支持网
TI专业的中文技术问题搜集分享网站

启用i2c后循环总线常忙

首先是我的代码。。。

#define GPIO_PB2_I2C0SCL 0x00010803
#define GPIO_PB3_I2C0SDA 0x00010C03

#define I2C0_MASTER_BASE 0x40020000

void i2cinit(void){
//not repeat it
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);
I2CMasterInitExpClk(I2C0_MASTER_BASE, SysCtlClockGet(), false);
return;
}

void sendi2c(unsigned char REG_Address,unsigned char REG_data){
I2CMasterSlaveAddrSet(I2C0_MASTER_BASE, SLAVE_ADDRESS, 0);
I2CMasterDataPut(I2C0_MASTER_BASE, 0X00);//SLAVE_ADDRESS);
I2CMasterControl(I2C0_MASTER_BASE, I2C_MASTER_CMD_SINGLE_SEND);
while(I2CMasterBusy(I2C0_MASTER_BASE));
I2CMasterDataPut(I2C0_MASTER_BASE, REG_Address);
I2CMasterControl(I2C0_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_START);
while(I2CMasterBusy(I2C0_MASTER_BASE));
I2CMasterDataPut(I2C0_MASTER_BASE, REG_data);
I2CMasterControl(I2C0_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
while(I2CMasterBusy(I2C0_MASTER_BASE));
I2CMasterControl(I2C0_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
while(I2CMasterBusy(I2C0_MASTER_BASE));
}

void compassesInit(void){
sendi2c(0x02,0x00);
}

在执行sendi2c的时候遇到while的判断语句就跳不出来,而且示波器上SCL与SDA常为低电平

另外特别蛋疼的是我所用版本的CCS里面hw_memmap里面没有对于 I2C0_MASTER_BASE的宏定义,只有

#define I2C0_BASE               0x40020000  // I2C0

看example里面的示例用的就是这个,于是我把master_base定义成了一样的数值…

ps  示例里面的while同样无法跳出….

求解答…

Wellin Zhang:

I2C的SCL配置需要用下面这个函数

 GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_3); GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_2);

 

另外,针对没有宏定义的问题,请到TI官网下载最新的TIVAware。

赞(0)
未经允许不得转载:TI中文支持网 » 启用i2c后循环总线常忙
分享到: 更多 (0)