软I2C-测试

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引脚

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值