This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

IIC 死循环

	I2CMasterSlaveAddrSet( I2C1_BASE, 0x50, 0);	
		I2CMasterDataPut( I2C1_BASE, 0x01 );												//写入主机数据(寄存器地址)
		while( I2CMasterErr(I2C1_BASE) | I2CMasterBusy(I2C1_BASE) );
		I2CMasterControl( I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_START );					//主机数据开始传输
        while( I2CMasterErr(I2C1_BASE) | I2CMasterBusy(I2C1_BASE) );
		I2CMasterDataPut( I2C1_BASE, 0x06  );											//写入主机数据(寄存器内容)SysCtlDelay( 5 );
		while( I2CMasterErr(I2C1_BASE) | I2CMasterBusy(I2C1_BASE) );
		I2CMasterControl( I2C1_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH );					//主机数据+stop传输
		while( I2CMasterErr(I2C1_BASE) | I2CMasterBusy(I2C1_BASE) );

为什么程序一直停在while呢?

  • 自己看了看你的寄存器,还是觉得是你初始化的问题。

  • 从这里得不到能够判断原因的信息,至少要把完整的模块放上来

  • Myi2cMaster_Init( I2C_BASE, GPIO_PORTG_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 );
    }
    
    这是初始化配置
  • Myi2cMaster_Init( I2C_BASE, GPIO_PORTG_BASE, 100000 );中的I2C_BASE和你用的I2C1_BASE一致不,可以debug看一下是否进行了对应的I2C设置

  • 看的好仔细。估计就是这里的问题了。