STM32F103系列IIC通讯代码
CH1--SDA;
CH2--SCL。
#include "iic.h" void IIC_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //PA1 - SCL GPIO_Init(GPIOA, &GPIO_InitStruct);//SCL会被拉低 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //PA0 - SDA SDA会被拉低 GPIO_Init(GPIOA, &GPIO_InitStruct); } void IIC_SDA_OUT(void) { GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //PA0 - SDA GPIO_Init(GPIOA, &GPIO_InitStruct); } void IIC_SDA_IN(void) { GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOA, &GPIO_InitStruct); } void IIC_Init(void) { IIC_SCL_H; IIC_SDA_H; } void IIC_Start(void) { IIC_SDA_H; Delayus(5); IIC_SCL_H; Delayus(6); IIC_SDA_L; Delayus(5); IIC_SCL_L; Delayus(5); } void IIC_Stop(void) { IIC_SDA_L; Delayus(5); IIC_SCL_H; Delayus(6); IIC_SDA_H; Delayus(5); } void IIC_Ack(void) { IIC_SDA_IN(); Delayus(5); if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0) { IIC_SDA_OUT(); IIC_SDA_L; } else { IIC_SDA_OUT(); IIC_SDA_H; } IIC_SCL_H; Delayus(5); IIC_SCL_L; Delayus(5); } void IIC_NoAck(void) { Delayus(6); IIC_SDA_H; Delayus(5); IIC_SCL_L; Delayus(5); IIC_SDA_L; Delayus(5); } void IIC_Write(uint8_t byte) { uint8_t i; Delayus(5); for(i = 0; i < 8; i ++) { if((byte&0x80) == 0x80) { IIC_SDA_H; } else { IIC_SDA_L; } byte = byte << 1; Delayus(5); IIC_SCL_H; Delayus(5); IIC_SCL_L; Delayus(5); } IIC_SDA_L; IIC_SCL_L; } uint8_t IIC_Read(void) { uint8_t i = 0,val = 0; IIC_SDA_IN(); for(i = 0; i < 8; i ++) { IIC_SCL_L; Delayus(5); val = (val << 1); if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) { val |= 0x01; } else { val |= 0x00; } Delayus(5); IIC_SCL_H; Delayus(5); } IIC_SCL_L; Delayus(5); IIC_SDA_OUT(); return val; } void IIC_WriteByte(uint8_t addr, uint8_t data) { // IIC_Init(); IIC_Start(); IIC_Write(0xae); IIC_Ack(); IIC_Write(addr); IIC_Ack(); IIC_Write(data); IIC_Ack(); IIC_Stop(); } uint8_t IIC_ReadByte(uint8_t addr) { uint8_t val = 0; IIC_Start(); IIC_Write(0xae); IIC_Ack(); IIC_Write(addr); IIC_Ack(); IIC_Start(); IIC_Write(0xaf); IIC_Ack(); val = IIC_Read(); IIC_NoAck(); IIC_Stop(); return val; }
#include "stm32f10x.h" #include "delay.h" #include "iic.h" #include "led.h" uint8_t Value = 0; int main(void) { Delay_Init(); IIC_GPIO_Init(); LED_GPIO_Init(); IIC_WriteByte(0x01, 0xF5); Delayus(500000); Delayus(500000); Value = IIC_ReadByte(0x01); Delayus(500000); while(1) { if(Value == 0xF5)LED_Test(); else { LED(ON); } } }