|
iic.c文件#include "iic.h" #include "delay.h" //IIC初始化 void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = IIC_SCL_PIN|IIC_SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //IIC_SCL_PIN|IIC_SDA_PIN推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(IIC_GPIO, &GPIO_InitStructure); GPIO_SetBits(IIC_GPIO,IIC_SCL_PIN|IIC_SDA_PIN); //设置为1 IIC_SCL_H; IIC_SDA_H; } //数据线输出模式 void iic_sda_out(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //IIC_SCL_PIN|IIC_SDA_PIN推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(IIC_GPIO, &GPIO_InitStructure); } //数据线输入模式 void iic_sda_in(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //IIC_SCL_PIN|IIC_SDA_PIN推挽输出 GPIO_Init(IIC_GPIO, &GPIO_InitStructure); } //IIC数据传送启动信号 //SCL为高电平的时候,SDA下降沿 void iic_start(void) { iic_sda_out(); //SDA线输出 IIC_SDA_H; //SDA为高电平 IIC_SCL_H; //SCL为高电平 SysTick_Delay_Us(5); IIC_SDA_L; //SDA下降沿 SysTick_Delay_Us(6); IIC_SCL_L; } //IIC数据传送停止信号 //SCL为高电平时,SDA上升沿 void iic_stop(void) { iic_sda_out(); //SDA线输出 IIC_SCL_L; //SDA为低电平 IIC_SDA_L; IIC_SCL_H; SysTick_Delay_Us(6); IIC_SDA_H; //SCL高电平 SysTick_Delay_Us(6); } //应答信号 void iic_ACK(void) { IIC_SCL_L; //SCL低电平 iic_sda_out(); IIC_SDA_L; //SDA为低电平 SysTick_Delay_Us(2); IIC_SCL_H; //SCL高电平 SysTick_Delay_Us(5); IIC_SCL_L; //SCL低电平 } //非应答信号 void iic_NACK(void) { IIC_SCL_L; //SCL低电平 iic_sda_out(); IIC_SDA_H; //SDA为高电平 SysTick_Delay_Us(2); IIC_SCL_H; //SCL高电平 SysTick_Delay_Us(5); IIC_SCL_L; //SCL低电平 } //IIC等待应答 u8 iic_wf_ack(void) { u8 times=0; iic_sda_in();//设置SDA为输入模式 IIC_SDA_H; SysTick_Delay_Us(1); IIC_SCL_H; SysTick_Delay_Us(1); while(GPIO_ReadInputDataBit(IIC_GPIO, IIC_SDA_PIN))//超时应答判断 { times++; SysTick_Delay_Us(1); if(times>250) { iic_stop(); return 1; } } IIC_SCL_L; return 0; } //IIC发送数据 void iic_SendByte(u8 txd) { u8 i; iic_sda_out();//设置SDA为输出模式 IIC_SCL_L; for(i=0;i<8;i++) { if((txd&0x80)>>7) IIC_SDA_H; else IIC_SDA_L; txd <<=1; SysTick_Delay_Us(2); IIC_SCL_H; SysTick_Delay_Us(2); IIC_SCL_L; SysTick_Delay_Us(2); } } //IIC读取数据 u8 iic_ReadByte(u8 ack) { u8 i,Receive=0; iic_sda_in();//设置SDA为输入模式 for(i=0;i<8;i++) { IIC_SCL_L; SysTick_Delay_Us(2); IIC_SCL_H; Receive<<= 1; if(GPIO_ReadInputDataBit(IIC_GPIO, IIC_SDA_PIN)) Receive|=0x01; SysTick_Delay_Us(1); } if(ack) iic_ACK(); else iic_NACK(); return Receive;//返回最终读取到的值 } iic.h文件 #ifndef __IIC_H #define __IIC_H #include "stm32f10x.h" #define IIC_GPIO GPIOB #define IIC_SCL_PIN GPIO_Pin_6 #define IIC_SDA_PIN GPIO_Pin_7 #define IIC_SCL_H GPIO_SetBits(GPIOB, GPIO_Pin_6) #define IIC_SCL_L GPIO_ResetBits(GPIOB, GPIO_Pin_6) #define IIC_SDA_H GPIO_SetBits(GPIOB, GPIO_Pin_7) #define IIC_SDA_L GPIO_ResetBits(GPIOB, GPIO_Pin_7) void IIC_Init(void); void iic_sda_out(void); void iic_sda_in(void); void iic_start(void); void iic_stop(void); void iic_ACK(void); void iic_NACK(void); u8 iic_wf_ack(void); void iic_SendByte(u8 txd); u8 iic_ReadByte(u8 ack); #endif mian.c文件 /** ****************************************************************************** * @file main.c * @author linchen * @version V1.0 * @date 2019-12-16 * @brief AD采集电压值输出至串口、IIC、SPI、 * @pin Rx A10 Tx A9 AD A0 IIC_SCL B6 IIC_SDA B7 PWM B5 * @pin SPI B13(SPI2_SCK) PB14(SPI2_MISO) PB15(SPI2_MOSI)****************************************************************************** */ #include "stm32f10x.h" #include "usart.h" #include "delay.h" #include "adc_dma.h" #include "iic.h" #include "pwm.h" #include "spi.h" u32 rx1 = 0,rx2 = 0; /** * @brief 主函数 * @param 无 * @retval 无 */ int main(void) { SysTick_Init();//初始化滴答定时器 IIC_Init();//iic初始化 USART_Config();//初始化USART 配置模式为 115200 8-N-1,中断接收 while(1) { printf("IIC通信开始!\r\n"); //iic_start();//发送起始信号 //iic_SendByte(0xA0);//发送从机地址,读数据 1010000(七位地址)1(读数据) //iic_wf_ack();//等待从机应答 iic_start();//发送起始信号 iic_SendByte(0xA1);//从机地址为A0,读数据 iic_wf_ack();//等待应答 rx1 = iic_ReadByte(1);//读第一次数据(16位中的高8位) iic_stop();//发送停止信号 iic_start();//发送起始信号 iic_SendByte(0xA1);//从机地址为A0,读数据 iic_wf_ack();//等待应答 rx2 = iic_ReadByte(1);//读第二次数据(16位中的低8位) iic_stop();//发送停止信号 SysTick_Delay_Ms(10); printf("IIC通信结束!\r\n"); if(rx1 != 0 || rx2 != 0) { printf("收到的数据:%d %d\r\n",rx1,rx2); rx1 = 0; rx2 = 0; } else { printf("未收到的数据!"); } SysTick_Delay_Ms(2000); } } |
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版