首先是我的代码。。。
#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。