IIC的初始化如下
Myi2cMaster_Init( I2C0_BASE, GPIO_PORTB_BASE, 100000 );
void Myi2cMaster_Init(uint32_t ui32Base, uint32_t PortBase,
uint32_t ui32SCLFreq)
{
ASSERT(_I2CBaseValid(ui32Base));
uint32_t SCLGPIO_Pin, SDAGPIO_Pin, SCLPinConfig, SDAPinConfig;
switch( ui32Base )
{
case I2C0_BASE:
SCLPinConfig = GPIO_PB2_I2C0SCL;
SDAPinConfig = GPIO_PB3_I2C0SDA;
SCLGPIO_Pin = GPIO_PIN_2;
SDAGPIO_Pin = GPIO_PIN_3;
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
break;
case I2C1_BASE:
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C1);
if( PortBase == GPIO_PORTG_BASE )
{
SCLPinConfig = GPIO_PG0_I2C1SCL;
SDAPinConfig = GPIO_PG1_I2C1SDA;
SCLGPIO_Pin = GPIO_PIN_0;
SDAGPIO_Pin = GPIO_PIN_1;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
}
else
{
SCLPinConfig = GPIO_PR0_I2C1SCL;
SDAPinConfig = GPIO_PR1_I2C1SDA;
SCLGPIO_Pin = GPIO_PIN_0;
SDAGPIO_Pin = GPIO_PIN_1;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOR);
}
break;
case I2C2_BASE:
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C2);
SCLPinConfig = GPIO_PG2_I2C2SCL;
SDAPinConfig = GPIO_PG3_I2C2SDA;
SCLGPIO_Pin = GPIO_PIN_2;
SDAGPIO_Pin = GPIO_PIN_3;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
break;
case I2C3_BASE:
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C3);
if( PortBase == GPIO_PORTG_BASE )
{
SCLPinConfig = GPIO_PG4_I2C3SCL;
SDAPinConfig = GPIO_PG5_I2C3SDA;
SCLGPIO_Pin = GPIO_PIN_4;
SDAGPIO_Pin = GPIO_PIN_5;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
}
else
{
SCLPinConfig = GPIO_PR4_I2C3SCL;
SDAPinConfig = GPIO_PR5_I2C3SDA;
SCLGPIO_Pin = GPIO_PIN_4;
SDAGPIO_Pin = GPIO_PIN_5;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOR);
}
break;
case I2C4_BASE:
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C4);
SCLPinConfig = GPIO_PG6_I2C4SCL;
SDAPinConfig = GPIO_PG7_I2C4SDA;
SCLGPIO_Pin = GPIO_PIN_6;
SDAGPIO_Pin = GPIO_PIN_7;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
break;
case I2C5_BASE:
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C5);
SCLPinConfig = GPIO_PB0_I2C5SCL;
SDAPinConfig = GPIO_PB1_I2C5SDA;
SCLGPIO_Pin = GPIO_PIN_0;
SDAGPIO_Pin = GPIO_PIN_1;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
break;
}
GPIOPinConfigure( SCLPinConfig );
GPIOPinConfigure( SDAPinConfig );
GPIOPinTypeI2CSCL( PortBase, SCLGPIO_Pin );
GPIOPinTypeI2C( PortBase, SDAGPIO_Pin );
I2CMasterPrivateInit( ui32Base, ui32SysClock, ui32SCLFreq);
I2CMasterEnable( ui32Base );
}
读取程序如下:
I2CMasterSlaveAddrSet( I2C0_BASE, 0x50, 0); I2CMasterDataPut( I2C0_BASE, 0x01 );
while( I2CMasterErr(I2C0_BASE) | I2CMasterBusy(I2C0_BASE) ); I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START ); I2CMasterDataPut( I2C0_BASE, 0x06 );//write data SysCtlDelay( 5 ); while( I2CMasterErr(I2C0_BASE) | I2CMasterBusy(I2C0_BASE) ); I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH ); //主机数据+stop传输 while( I2CMasterErr(I2C0_BASE) | I2CMasterBusy(I2C0_BASE) );
程序移植停在了些寄存器地址后的While语句中了。为什么会这样呢?