你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32软件模拟IIC程序代码(从机为stm8s)

[复制链接]
linchenchen 发布时间:2019-12-25 15:30
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                 RxA10 TxA9                ADA0        IIC_SCLB6        IIC_SDAB7                PWMB5               
        * @pin                 SPIB13(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);
        }       
}       


收藏 评论0 发布时间:2019-12-25 15:30

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版