打印

GD32F130硬件IIC问题

[复制链接]
4664|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
X小波是也|  楼主 | 2016-5-19 17:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序是参考官方例程的
卡在while(!I2C_StateDetect( I2C1 , I2C_PROGRAMMINGMODE_MASTER_SBSEND))
各位大牛帮忙分析一下,感谢!~
void IIC_Init(void)
{

    /* Enable GPIOB clock */
    RCC_AHBPeriphClock_Enable( RCC_AHBPERIPH_GPIOB, ENABLE );

    /* Enable I2C1 APB1 clock */
    RCC_APB1PeriphClock_Enable( RCC_APB1PERIPH_I2C1, ENABLE );

    /* Enable DMA1 clock */
    RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_DMA1, ENABLE);
                printf("I2C 1\r\n");
    /* Cofigure the GPIO */
    {
        GPIO_InitPara GPIO_InitStructure;
   
        GPIO_PinAFConfig( GPIOB ,GPIO_PINSOURCE6,GPIO_AF_1 );
        GPIO_PinAFConfig( GPIOB ,GPIO_PINSOURCE7,GPIO_AF_1 );

        /* I2C1 GPIO */
        GPIO_InitStructure.GPIO_Pin   = GPIO_PIN_6 |   // I2C1 SCL
                                        GPIO_PIN_7;    // I2C1 SDA

        GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
        GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;//OD;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PUPD_NOPULL;
        GPIO_Init( GPIOB , &GPIO_InitStructure );
        
    }

    /* Cofigure the I2C1 interface */
    {
        I2C_InitPara I2C_InitStructure;
                        I2C_InitStructure.I2C_Protocol        = I2C_PROTOCOL_I2C;//I2C_PROTOCOL_SMBUSHOST;
        I2C_InitStructure.I2C_DutyCycle       = I2C_DUTYCYCLE_2;
        I2C_InitStructure.I2C_BitRate         = 100000;
        I2C_InitStructure.I2C_AddressingMode  = I2C_ADDRESSING_MODE_7BIT;
        I2C_InitStructure.I2C_DeviceAddress   = 0x08;
        I2C_Init(I2C1, &I2C_InitStructure);
    }
//                I2C1->CTLR2|=0x04;

    /* Enable I2C1 */
    I2C_Enable( I2C1, ENABLE );
   
    /* Enable Acknowledge */
    I2C_Acknowledge_Enable( I2C1 , ENABLE );

    /* Enable the I2C1 DMA requests */
    I2C_DMA_Enable( I2C1 , ENABLE );
                printf("I2C bus init success...\r\n");
}

u8 IICwriteBytes(u8 dev, u8 ReadAddr, u8 NumByteToWrite, uint8_t* pBuffer)
{
   
    /*!< While the bus is busy */
    while(I2C_GetBitState( I2C1 , I2C_FLAG_I2CBSY))
    {
                        printf("IIC busy\r\n");         
    }
   
    /*!< Send START condition */
    I2C_StartOnBus_Enable( I2C1 , ENABLE );
   
    /*!< Test on EV5 and clear it */
    while(!I2C_StateDetect( I2C1 , I2C_PROGRAMMINGMODE_MASTER_SBSEND))///卡在此处
    {
                        printf("Test on EV5\r\n");
    }
   
    /*!< Send MPU6050 address for write */
    I2C_AddressingDevice_7bit( I2C1 , dev, I2C_DIRECTION_TRANSMITTER);////////////////////////
  
    /*!< Test on EV6 and clear it */
    while(!I2C_StateDetect( I2C1 , I2C_PROGRAMMINGMODE_MASTER_TRANSMITTER_ADDSEND))
    {
                        printf("Test on EV6\r\n");
    }
  
   
    /*!< Send the MPU6050's internal address to write to : only one byte Address */
    I2C_SendData( I2C1 , ReadAddr);
   
    /*!< Test on EV8 and clear it */
    while(!I2C_StateDetect( I2C1 , I2C_PROGRAMMINGMODE_MASTER_BYTE_TRANSMITTED))
    {
                        printf("Test on EV8r\n");
    }  
   
    /* Configure the DMA Tx Channel  */
    {
        DMA_InitPara   DMA_InitStruc;

        /* Configure the DMA Tx Channel with the buffer address and the buffer size */
        DMA_DeInit( DMA1_CHANNEL2 );
        DMA_InitStruc.DMA_PeripheralBaseAddr  = (uint32_t)&I2C1->DTR ;
        DMA_InitStruc.DMA_MemoryBaseAddr      = (uint32_t)pBuffer;   
        DMA_InitStruc.DMA_DIR                 = DMA_DIR_PERIPHERALDST;   
        DMA_InitStruc.DMA_BufferSize          = (uint32_t)NumByteToWrite;            
        DMA_InitStruc.DMA_PeripheralInc       = DMA_PERIPHERALINC_DISABLE;
        DMA_InitStruc.DMA_MemoryInc           = DMA_MEMORYINC_ENABLE;
        DMA_InitStruc.DMA_PeripheralDataSize  = DMA_PERIPHERALDATASIZE_BYTE;
        DMA_InitStruc.DMA_MemoryDataSize      = DMA_MEMORYDATASIZE_BYTE;
        DMA_InitStruc.DMA_Mode                = DMA_MODE_NORMAL ;
        DMA_InitStruc.DMA_Priority            = DMA_PRIORITY_VERYHIGH ;
        DMA_InitStruc.DMA_MTOM                = DMA_MEMTOMEM_DISABLE;
        DMA_Init( DMA1_CHANNEL2 , &DMA_InitStruc );  
    }
     

    /* Inform the DMA that the next End Of Transfer Signal will be the last one */
    I2C_DMALastTransfer_Enable( I2C1 , ENABLE );
   
    /* Enable the I2C1 DMA Tx Channel */
    DMA_Enable( DMA1_CHANNEL2 , ENABLE );  

    /* Wait until I2C1 Rx DMA1 Channel Transfer Complete */
    while ( DMA_GetBitState( DMA1_FLAG_TC2 ) == RESET)
    {
                        printf("IIC RX...\r\n");          
    }

    /* Wait until the last data byte is received into the shift register */
    while(!I2C_GetBitState(I2C1, I2C_FLAG_BTC))
                {
                }


    /* Clear ADDR Flag by reading STR1 then STR2 registers (STR1 have already
       been read) */
    (void)I2C1->STR2;
                printf("IIC RX doen...\r\n");
    /* Send a stop condition */
    I2C_StopOnBus_Enable( I2C1, ENABLE );
   
    return 1;
}
沙发
vivilzb1985| | 2016-5-20 21:35 | 只看该作者
I2C_StopOnBus_Enable( I2C1, ENABLE ),这个是启动I2C总线的。

使用特权

评论回复
板凳
zb0830| | 2016-5-21 15:31 | 只看该作者
看下你的设置是否正确

使用特权

评论回复
地板
engao| | 2016-5-21 22:46 | 只看该作者
外接上拉电阻了吗

使用特权

评论回复
5
dianz| | 2016-5-21 23:16 | 只看该作者
配置是否正确吗,再检查下

使用特权

评论回复
6
zya888| | 2016-5-21 23:24 | 只看该作者
楼上的分析有可能

使用特权

评论回复
7
ah9b87| | 2016-5-22 09:03 | 只看该作者
有时就会出现这种问题,建议在这里加个延时,报个错之类的,在实际的应用中,不能出现死机的情况

使用特权

评论回复
8
vibra2016| | 2016-5-22 11:46 | 只看该作者
这个I2C总线的采用DMA模式的话效率会更高的。

使用特权

评论回复
9
steven_fae| | 2016-5-22 12:35 | 只看该作者
修改以下两个宏

#define I2C_PROGRAMMINGMODE_MASTER_TRANSMITTER_ADDSEND                  ((uint32_t)0x00070002)

#define I2C_PROGRAMMINGMODE_SLAVE_TRANSMITTER_ADDSEND                      ((uint32_t)0x00060002)

使用特权

评论回复
10
tongbu2015| | 2016-5-23 22:44 | 只看该作者
这个配合下相关的硬件的检查下的

使用特权

评论回复
11
smilingangel| | 2016-5-24 22:01 | 只看该作者
I2C总线的应用怎是很方便的

使用特权

评论回复
12
wolfgang_z| | 2016-5-25 14:03 | 只看该作者
steven_fae 发表于 2016-5-22 12:35
修改以下两个宏

#define I2C_PROGRAMMINGMODE_MASTER_TRANSMITTER_ADDSEND                  ((uint32_t)0 ...

不要误导观众

130的硬件参考手册是GD32F1x0 的手册, 不能用GD32F10x的手册来误导。

使用特权

评论回复
13
X小波是也|  楼主 | 2016-5-28 09:49 | 只看该作者
谢谢各位问题已解决,程序前部分的模块中已经出现了一次 RCC_AHBPeriphClock_Enable( RCC_AHBPERIPH_GPIOB, ENABLE );
貌似在GD中这类语句只能出现一次否则会卡死或时钟关闭,亲测,我把它换成直接操作寄存器就好了,应该是GD库的缺陷
RCC->AHBCCR|=1<<18;    //使能PORTB时钟

使用特权

评论回复
14
182317716| | 2016-5-30 08:45 | 只看该作者
GD代理商QQ:182317716 更多样品,中文手册.开发工具支持!
---13686827076-王生

使用特权

评论回复
15
zzzhui| | 2016-5-30 22:51 | 只看该作者
检查下,硬件

使用特权

评论回复
16
hy907539007| | 2016-6-20 16:30 | 只看该作者
硬件IIC还是和STM32一样的吗?

使用特权

评论回复
17
zhangbo1985| | 2016-6-22 22:13 | 只看该作者
关于IIC总线的操作总是能吸引我们的注意的,这个总线经常用的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

27

帖子

0

粉丝