STM32 IIC
#include "Type.h" #include "IIC.h" #include "Delay.h" void I2C_Init(void) { GPIO_InitTypeDef GPIO_InitStructer; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructer.GPIO_Pin=GPIO_Pin_2 | GPIO_Pin_3; //6--SCL 7--SDA GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructer); } void SDA_OUT(void) { GPIO_InitTypeDef GPIO_InitStructer; GPIO_InitStructer.GPIO_Pin= GPIO_Pin_2; GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructer); } void SDA_IN(void) { GPIO_InitTypeDef GPIO_InitStructer; GPIO_InitStructer.GPIO_Pin= GPIO_Pin_2; GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructer); } void SDA_Set() { GPIOA->ODR |= GPIO_Pin_2; } void SDA_Reset() { GPIOA->ODR &= (u16)(~GPIO_Pin_2); } uint8 SDA_Get() { if(GPIOA->IDR&GPIO_Pin_2) return 0x01; else return 0x00; } void SCL_Set() { GPIOA->ODR |= GPIO_Pin_3; } void SCL_Reset() { GPIOA->ODR &= (u16)(~GPIO_Pin_3); } void I2C_Start(void) { SDA_OUT(); SDA_Set();//SDA H Delay_us(2); SCL_Set();//SCL H Delay_us(2); SDA_Reset();//SDA L Delay_us(2); SCL_Reset();//SCL L Delay_us(2); } void I2C_Stop(void) { SDA_OUT(); SDA_Reset();//SDA L Delay_us(2); SCL_Set();//SCL H Delay_us(2); SDA_Set();//SDA H Delay_us(2); } u8 I2C_Wait_Ask(void) { int count=0; SDA_IN(); SCL_Set(); Delay_us(2); while(SDA_Get()) { count++; if(count>100) { I2C_Stop(); return 1; } Delay_us(1); } SCL_Reset(); Delay_us(2); return 0; } void I2C_WriteByte(u8 data) { u8 i; SDA_OUT(); for(i=0;i<8;i++) { if(data & 0x80) //MSB,??????????? SDA_Set(); else SDA_Reset(); Delay_us(2); SCL_Set(); Delay_us(2); SCL_Reset(); Delay_us(2); data<<=1; } } u8 I2C_ReadByte(void) { u8 data,i; data = 0; SDA_IN(); for(i=0;i<8;i++) { data<<=1; SCL_Set(); Delay_us(2); if(SDA_Get()) data|=0x01; SCL_Reset(); Delay_us(2); } return data; } #define WD_DEVICE_ADDR 0xA6 //ALT ½ÓµØΪA6 ½ÓµçԴΪ3A #define RD_DEVICE_ADDR 0xA7 //?????IIC???????,??ALT ADDRESS???????? void I2C_WriteData(uint8 addr, uint8 data) { I2C_Start(); I2C_WriteByte(WD_DEVICE_ADDR);//OLED?? if(I2C_Wait_Ask()==1) return ; I2C_WriteByte(addr);//????? if(I2C_Wait_Ask()==1) return ; I2C_WriteByte(data); I2C_Wait_Ask(); I2C_Stop(); } uint8 I2C_ReadData(uint8 addr) { uint8 temp; I2C_Start(); I2C_WriteByte(WD_DEVICE_ADDR);//OLED?? if(I2C_Wait_Ask()==1) return 0; I2C_WriteByte(addr);//????? if(I2C_Wait_Ask()==1) return 0; I2C_Start(); I2C_WriteByte(RD_DEVICE_ADDR);//OLED?? if(I2C_Wait_Ask()==1) return 0; temp = I2C_ReadByte();//????? I2C_Stop(); return temp; }
#ifndef __IIC_H__ #define __IIC_H__ #include "Type.h" #include "stm32f10x.h" void I2C_Init(void); void I2C_WriteData(uint8 addr, uint8 data); uint8 I2C_ReadData(uint8 addr); #endif