【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的内容进行修改
/*******************************************************************************
* 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;
还有是否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");
程序开始测试是这样的。参数怎么改变都不行,结果是一样。
从结果可以看出:没有正常执行,就死机了。在@hzz592788网友之前也做过I2C的程序也是失败的,听到有和我一样失败的测试,所以重新做了I2C的程序。就把这次的过程写了出来。
我记得以前STM32F103的时候人们就说ST的I2C如何的不堪,但是我的I2C程序从来都没有任何问题。所以也没有什么感觉。通过CH32V103的SPI和I2C测试的失败让我很受伤!
是不是,这真是芯片的BUG!希望都人能够给我一个明确的答案!
|