401|3

1459

帖子

2

资源

纯净的硅(高级)

【RISC-V MCU CH32V103测评】IIC硬件测试 [复制链接]

大家在看到图片的时候请不要误会,这次和SPI一样都是失败的测试!失败的测试!

本来不想写的,但是觉得既然是测试,就要把测试的过程记录下来。当然还是希望有人能够给点意见。

IMG_1406.JPG 这张图是我使用@hzz592788网友的程序修改后测试的结果,我把其中的引脚定义成:

SDA --> PB7

SCL --> PB6

与I2C1的引脚相同。这个程序只能说明我的屏没有问题,我有多块屏OLED的屏,但是只有这块是IIC的,其余的是SPI的接口。

image.png 我按照《CH32V103DS0.PDF》的记录对照wch的程序C:\CH32V103EVT\EVT\EXAM\I2C\I2C_EEPROM的内容进行修改

/*******************************************************************************
* Function Name  : IIC_Init
* Description    : Initializes the IIC peripheral.
* Input          : None
* Return         : None
*******************************************************************************/
void IIC_Init( u32 bound, u16 address )
{
    GPIO_InitTypeDef GPIO_InitStructure;
    I2C_InitTypeDef I2C_InitTSturcture;

    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C1, ENABLE );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOB, &GPIO_InitStructure );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOB, &GPIO_InitStructure );

    I2C_InitTSturcture.I2C_ClockSpeed = bound;
    I2C_InitTSturcture.I2C_Mode = I2C_Mode_I2C;
    I2C_InitTSturcture.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitTSturcture.I2C_OwnAddress1 = address;
    I2C_InitTSturcture.I2C_Ack = I2C_Ack_Enable;//
    //I2C_InitTSturcture.I2C_Ack = I2C_Ack_Disable;//
    I2C_InitTSturcture.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

    I2C_Init( I2C1, &I2C_InitTSturcture );

    I2C_Cmd(I2C1, ENABLE );

    I2C_AcknowledgeConfig( I2C1, ENABLE );
}

初始化的程序参数及意义我都明白。应该是不会错的。这里面只有PB6,PB7这两个引脚的总线是APB2,而I2C1的时钟是APB1。为什么把APB2的时钟打开且引脚设置成输出,这个有点疑惑。所以我把这两种模式都实验了一下。

//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

image.png 还有是否ACK,也测试了一边。

 I2C_InitTSturcture.I2C_Ack = I2C_Ack_Enable;//
    //I2C_InitTSturcture.I2C_Ack = I2C_Ack_Disable;//

这是I2C的写入程序。地址和数据都是8位的。

void Write_IIC_Byte(u16 WriteAddr,u8 DataToWrite)
{

    while( I2C_GetFlagStatus( I2C2, I2C_FLAG_BUSY ) != RESET );
    I2C_GenerateSTART( I2C2, ENABLE );

    while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_MODE_SELECT ) );
    I2C_Send7bitAddress( I2C2, 0x78, I2C_Direction_Transmitter );

    while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ) );

#if (Address_Lenth  == Address_8bit)
    I2C_SendData( I2C2, (u8)(WriteAddr&0x00FF) );
    while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );

#elif (Address_Lenth  == Address_16bit)
    I2C_SendData( I2C2, (u8)(WriteAddr>>8) );
    while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );

    I2C_SendData( I2C2, (u8)(WriteAddr&0x00FF) );
    while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );

#endif

    if( I2C_GetFlagStatus( I2C2, I2C_FLAG_TXE ) !=  RESET )
    {
        I2C_SendData( I2C2, DataToWrite);
    }

    while( !I2C_CheckEvent( I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED ) );
    I2C_GenerateSTOP( I2C2, ENABLE );


}

这个应该也是没有问题的。

   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);
    printf("SystemClk:%d\r\n",SystemCoreClock);

    printf("GPIO Toggle TEST\r\n");
    GPIO_Toggle_INIT();
    OLED_Init();            //初始化OLED
    OLED_Clear()    ;

    t=' ';
    OLED_ShowCHinese(0,0,0);//中
    OLED_ShowCHinese(18,0,1);//景
    OLED_ShowCHinese(36,0,2);//园
    OLED_ShowCHinese(54,0,3);//电
    OLED_ShowCHinese(72,0,4);//子
    OLED_ShowCHinese(90,0,5);//科
    OLED_ShowCHinese(108,0,6);//技
    OLED_Clear();
    printf("GPIO OLED TEST\r\n");

程序开始测试是这样的。参数怎么改变都不行,结果是一样。

image.png 从结果可以看出:没有正常执行,就死机了。在@hzz592788网友之前也做过I2C的程序也是失败的,听到有和我一样失败的测试,所以重新做了I2C的程序。就把这次的过程写了出来。

我记得以前STM32F103的时候人们就说ST的I2C如何的不堪,但是我的I2C程序从来都没有任何问题。所以也没有什么感觉。通过CH32V103的SPI和I2C测试的失败让我很受伤!

是不是,这真是芯片的BUG!希望都人能够给我一个明确的答案!

 

 

 

 

 


回复

35

帖子

0

资源

一粒金砂(中级)

一开始我也是想用硬件IIC驱动,感觉思路没问题啊。而且我发现,它随机某个时间卡在主循环的一个if语句那里,按复位键都没用,必须断电重新上电。让我更加疑惑了。


回复

36

帖子

0

资源

一粒金砂(中级)

程序中所用iic不一致,GPIO初始化中所用为iic1,后面又用了iic2,导致程序运行肯定有问题

问题1.jpg 问题2.jpg


回复

1459

帖子

2

资源

纯净的硅(高级)

是的,我把错误修改了,是这里的问题。一会我把程序发上来

IIC_SSD1306.zip (147.04 KB, 下载次数: 1)


回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/6 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表