OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4826|回复: 5

stm32L475实现软件iic通信,但是一直没通,示波器波型这个样子,哪里问题了

[复制链接]

1

主题

8

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2022-3-11
在线时间
3 小时
发表于 2022-3-11 10:19:28 | 显示全部楼层 |阅读模式
1金钱
其中iic.c文件这样的
#ifndef _MYIIC_H
#define _MYIIC_H
#include "sys.h"



#define SDA_IN()  {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=0<<(9*2);}        //PC1ê&#228;è&#235;&#196;£ê&#189;
#define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<(9*2);}         //PC1ê&#228;3&#246;&#196;£ê&#189;

#define IIC_SCL(n)                (n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET))//SCL
#define IIC_SDA(n)                (n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET))//SDA
#define READ_SDA                  HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)//ê&#228;è&#235;SDA


void IIC_Init(void);                //3&#245;ê&#188;&#187;ˉIICμ&#196;IO&#191;ú
void IIC_Start(void);                                //·¢&#203;íIIC&#191;aê&#188;D&#197;o&#197;
void IIC_Stop(void);                                  //·¢&#203;íIICí£&#214;1D&#197;o&#197;
void IIC_Send_Byte(u8 txd);                        //IIC·¢&#203;íò&#187;&#184;&#246;×&#214;&#189;ú
u8 IIC_Read_Byte(unsigned char ack);//IIC&#182;áè&#161;ò&#187;&#184;&#246;×&#214;&#189;ú
u8 IIC_Wait_Ack(void);                                 //IICμè′yACKD&#197;o&#197;
void IIC_Ack(void);                                        //IIC·¢&#203;íACKD&#197;o&#197;
void IIC_NAck(void);                                //IIC2&#187;·¢&#203;íACKD&#197;o&#197;

void IIC_Write_One_Byte(u8 daddr, u8 addr, u8 data);
u8 IIC_Read_One_Byte(u8 daddr, u8 addr);
#endif







iic.h文件这样子
#include "myiic.h"
#include "delay.h"


/**
* @brief        IIC3&#245;ê&#188;&#187;ˉoˉêy
*
* @param   void
*
* @return  void
*/
void IIC_Init(void)
{
    GPIO_InitTypeDef GPIO_Initure;

    __HAL_RCC_GPIOB_CLK_ENABLE();   //ê1&#196;üGPIOCê±&#214;ó

    GPIO_Initure.Pin = GPIO_PIN_8 | GPIO_PIN_9;
    GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP; //í&#198;íìê&#228;3&#246;
    GPIO_Initure.Pull = GPIO_PULLUP;        //é&#207;à-
    GPIO_Initure.Speed = GPIO_SPEED_FAST;   //&#191;ì&#203;ù
    HAL_GPIO_Init(GPIOB, &GPIO_Initure);

    IIC_SDA(1);
    IIC_SCL(1);
}

/**
* @brief        2úéúIIC&#198;eê&#188;D&#197;o&#197;
*
* @param   void
*
* @return  void
*/
void IIC_Start(void)
{
    SDA_OUT();     //sda&#207;&#223;ê&#228;3&#246;
    IIC_SDA(1);
    IIC_SCL(1);
    delay_us(4);
    IIC_SDA(0);//START:when CLK is high,DATA change form high to low
        delay_us(4);
    IIC_SCL(0);//&#199;ˉ×&#161;I2C×ü&#207;&#223;£&#172;×&#188;±&#184;·¢&#203;í&#187;ò&#189;óê&#213;êy&#190;Y
}
/**
* @brief        2úéúIICí£&#214;1D&#197;o&#197;
*
* @param   void
*
* @return  void
*/
void IIC_Stop(void)
{
    SDA_OUT();//sda&#207;&#223;ê&#228;3&#246;
        IIC_SDA(0);
    IIC_SCL(1);
    delay_us(4);
        IIC_SDA(1);//STOP:when CLK is high DATA change form low to high
        delay_us(4);
        IIC_SCL(0);//·¢&#203;íI2C×ü&#207;&#223;&#189;áê&#248;D&#197;o&#197;
}

/**
* @brief        μè′yó|′eD&#197;o&#197;μ&#189;à′
*
* @param   void
*
* @return  u8                1£&#172;&#189;óê&#213;ó|′eê§°ü
*                                        0£&#172;&#189;óê&#213;ó|′e3é1|
*/
u8 IIC_Wait_Ack(void)
{
    u8 ucErrTime = 0;
    SDA_IN();      //SDAéè&#214;&#195;&#206;aê&#228;è&#235;
    IIC_SDA(1);
    delay_us(2);
    IIC_SCL(1);
    delay_us(2);

    while(READ_SDA)
    {
        ucErrTime++;

        if(ucErrTime > 250)
        {
            IIC_Stop();
            return 1;
        }
    }

    IIC_SCL(0);//ê±&#214;óê&#228;3&#246;0
    return 0;
}
/**
* @brief        2úéúACKó|′e
*
* @param   void
*
* @return  void
*/
void IIC_Ack(void)
{
    IIC_SCL(0);
    SDA_OUT();
    IIC_SDA(0);
    delay_us(2);
    IIC_SCL(1);
    delay_us(2);
    IIC_SCL(0);
}
/**
* @brief        2&#187;2úéúACKó|′e
*
* @param   void
*
* @return  void
*/
void IIC_NAck(void)
{
    IIC_SCL(0);
    SDA_OUT();
    IIC_SDA(1);
    delay_us(2);
    IIC_SCL(1);
    delay_us(2);
    IIC_SCL(0);
}
/**
* @brief        IIC·¢&#203;íò&#187;&#184;&#246;×&#214;&#189;ú
*
* @param   txd                Dèòa·¢&#203;íμ&#196;êy&#190;Y
*
* @return  void
*/
void IIC_Send_Byte(u8 txd)
{
    u8 t;
    SDA_OUT();
    IIC_SCL(0);//à-μíê±&#214;ó&#191;aê&#188;êy&#190;Y′&#171;ê&#228;

    for(t = 0; t < 8; t++)
    {
        IIC_SDA((txd & 0x80) >> 7);
        txd <<= 1;
        IIC_SCL(1);
        delay_us(2);
        IIC_SCL(0);
        delay_us(2);
    }
}
/**
* @brief        &#182;á1&#184;&#246;×&#214;&#189;úêy&#190;Y
*
* @param   ack                1£&#172;·¢&#203;íACK                0£&#172;·¢&#203;ínACK
*
* @return  u8                ·μ&#187;&#216;&#182;áè&#161;êy&#190;Y
*/
u8 IIC_Read_Byte(unsigned char ack)
{
    unsigned char i, receive = 0;
    SDA_IN();//SDAéè&#214;&#195;&#206;aê&#228;è&#235;

    for(i = 0; i < 8; i++)
    {
        IIC_SCL(0);
        delay_us(2);
        IIC_SCL(1);
        receive <<= 1;
        if(READ_SDA)receive++;
        delay_us(2);
    }

    if(!ack)
        IIC_NAck();//·¢&#203;ínACK
    else
        IIC_Ack(); //·¢&#203;íACK

    return receive;
}
最后我示波器的波形是这样的

file:///C:\Users\13998\Documents\Tencent Files\1399834302\Image\C2C\9EE55A48F534502512B563E46223B0AD.jpgfile:///C:\Users\13998\Documents\Tencent Files\1399834302\Image\C2C\3D0822640D5A556D428600A818D9F18A.jpgfile:///C:\Users\13998\Documents\Tencent Files\1399834302\Image\C2C\F4410C3CF190CE2603DF160715FD5ECE.jpg

然后对于快速模式400Khz,延时多少us合适呢?
麻烦大佬帮忙解答一下。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2022-3-11
在线时间
3 小时
 楼主| 发表于 2022-3-11 18:58:37 | 显示全部楼层
回复

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1734
金钱
1734
注册时间
2021-4-11
在线时间
320 小时
发表于 2022-3-12 10:06:14 | 显示全部楼层
顶                        
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2022-3-13 23:21:43 | 显示全部楼层
波形呢?  400Khz, 你延时2us足以
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2022-3-11
在线时间
3 小时
 楼主| 发表于 2022-3-14 21:28:12 | 显示全部楼层
E:\桌面
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2022-3-11
在线时间
3 小时
 楼主| 发表于 2022-3-14 21:31:26 | 显示全部楼层
  示波器的波形如下:  不晓得哪里的问题呢?
F4410C3CF190CE2603DF160715FD5ECE.jpg 9EE55A48F534502512B563E46223B0AD.jpg 3D0822640D5A556D428600A818D9F18A.jpg


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-6 15:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表