【RISC-V MCU CH32V103测评】IIC硬件测试
[复制链接]
大家在看到图片的时候请不要误会,这次和SPI一样都是失败的测试!失败的测试!
本来不想写的,但是觉得既然是测试,就要把测试的过程记录下来。当然还是希望有人能够给点意见。
这张图是我使用@hzz592788网友的程序修改后测试的结果,我把其中的引脚定义成:
SDA --> PB7
SCL --> PB6
与I2C1的引脚相同。这个程序只能说明我的屏没有问题,我有多块屏OLED的屏,但是只有这块是IIC的,其余的是SPI的接口。
我按照《CH32V103DS0.PDF》的记录对照wch的程序C:\CH32V103EVT\EVT\EXAM\I2C\I2C_EEPROM的内容进行修改
-
- 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_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;
还有是否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_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");
程序开始测试是这样的。参数怎么改变都不行,结果是一样。
从结果可以看出:没有正常执行,就死机了。在@hzz592788网友之前也做过I2C的程序也是失败的,听到有和我一样失败的测试,所以重新做了I2C的程序。就把这次的过程写了出来。
我记得以前STM32F103的时候人们就说ST的I2C如何的不堪,但是我的I2C程序从来都没有任何问题。所以也没有什么感觉。通过CH32V103的SPI和I2C测试的失败让我很受伤!
是不是,这真是芯片的BUG!希望都人能够给我一个明确的答案!
|