1.测试硬件I2C
1.1测数据发送





#include "stm32f10x.h"
#include "i2c.h"//引用这个库
void My_I2C1_Init(void);
int main(void)
{
My_I2C1_Init();
uint8_t commands[] = {0x00, 0x8d, 0x14, 0xaf, 0xa5};
My_I2C_SendBytes(I2C1, 0x78, commands, 5);
while(1)
{
}
}
void My_I2C1_Init(void)
{
//#1.对PB6和PB7进行初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitrypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_ Pin_6 | GPIO_Pin_7;
GPIO_InitStrlct.GPIO_Mode = GPIO_Mode_OD;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_ 2MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
//#2.对I2C1进行初始化
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);//施加复位信号
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);//释放复位信号
I2C_InitTypeDef I2C_InitStruct;
I2C_InitStruct.I2C_ClockSpeed = 400000;
I2C_InitStruct.I2C_Mode = I2C Mode_I2C;
I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_Init(I2C1,&I2C_InitStruct);//调用I2C_InitStruct对I2C1进行初始化
I2C_Cmd(I2C1,ENABLE);//关闭时钟
}
1.2.测数据接收

用板载OLED作为电源指示灯,通过I2C接口从屏幕读一个字节,字节里第六个比特位表示屏幕是点亮还是熄灭(D6=0,表示屏幕开启;D6=1,表示屏幕关闭)
编程:
调用My_I2C_ReceiveBytes编程接口读一个字节判断第六个比特位是0还是1
控制板载OLED(PC13)点亮还是熄灭
#include "stm32f10x.h"
#include "i2c.h"//引用这个库
void My_I2C1_Init(void);
void My_OnBoardLED_Init(void);
int main(void)
{
My_I2C1_Init();
My_OnBoardLED_Init();
uint8_t commands[] = {0x00, 0x8d, 0x14, 0xaf, 0xa5};
My_I2C_SendBytes(I2C1, 0x78, commands, 5);
uint8_t rcvd;
My_I2C_ReceiveBytes(I2c1, 0x78, &rcvd, 1);
if((rcvd & (0x01<< 6))== 0)
{
GPtO_WriteBit (GPIOC, GPIO_Pin_13, Bit_RESET);
}
else
{
GPtO_WriteBit (GPIOC, GPIO_Pin_13, Bit_SET);
}
while(1)
{
}
}
void My_I2C1_Init(void)
{
//#1.对PB6和PB7进行初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitrypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_ Pin_6 | GPIO_Pin_7;
GPIO_InitStrlct.GPIO_Mode = GPIO_Mode_OD;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_ 2MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
//#2.对I2C1进行初始化
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);//施加复位信号
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);//释放复位信号
I2C_InitTypeDef I2C_InitStruct;
I2C_InitStruct.I2C_ClockSpeed = 400000;
I2C_InitStruct.I2C_Mode = I2C Mode_I2C;
I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_Init(I2C1,&I2C_InitStruct);//调用I2C_InitStruct对I2C1进行初始化
I2C_Cmd(I2C1,ENABLE);//关闭时钟
}
void My_OnBoardLED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, BitSET);
}
2.测试软件件I2C

对SI2C进行初始化
发送数据
接收数据
#include "stm32f10x.h"
#include "i2c.h"//引用这个库
SI2C_TypeDef si2c;
void My_OnBoardLED_Init(void);
int main(void)
{
//指定SCL、SDA的位置和引脚
si2c.SCL_GPIOX = GPIOB;
si2c.SCL_GPIO_Pin = GPIO_Pin_6;
si2c.SDA_GPIOX = GPIOB;
si2c.SDA_SPIo_Pin = GPIO_Pin_7;
My_SI2C_Init(&si2c);
My_OnBoardLED_Init();
uint8_t commands[] = {0x00, 0x8d, 0x14, 0xaf, 0xa5};
My_SI2C_SendBytes(&si2c, 0x78, commands, 5);
uint8_t rcvd;
My_SI2C_ReceiveBytes(&si2c, 0x78, &rcvd, 1);
if((rcvd & (0x01<< 6))== 0)
{
GPtO_WriteBit (GPIOC, GPIO_Pin_13, Bit_RESET);
}
else
{
GPtO_WriteBit (GPIOC, GPIO_Pin_13, Bit_SET);
}
while(1)
{
}
}
void My_OnBoardLED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, BitSET);
}
总结
软I2C和硬I2C的区别:软I2C更简单,不用初始化I2C和IO引脚
4250

被折叠的 条评论
为什么被折叠?



