STM32F0 模拟IIC 从机应答时序混乱是什么原因

2019-08-14 04:16发布

本帖最后由 怕水的鱼 于 2017-9-1 10:54 编辑

最近在搞电能芯片BQ32Z100-G1这个芯片 需要用IIC通信 用的是模拟IIC 发送数据时序正常 等待应答时时序很混乱第九个时钟脉冲保持的时间很乱  用的是原子哥的代码 不知道哪出现的问题 请教各位大神看看 谢谢了

1504233378(1).jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
怕水的鱼
1楼-- · 2019-08-14 07:04
#include "myiic.h"

void Delayus(uint32_t counter) //1 1US 8 2US 24 4US
{
        uint32_t i;
        for(i =0;i<counter;i++)
        {
                __NOP;
        }
       
}

//3&#245;ê&#188;&#187;ˉIIC
void IIC_Init(void)
{                       
  GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//ê1&#196;üGPIOBê±&#214;ó

  //GPIOB8,B93&#245;ê&#188;&#187;ˉéè&#214;&#195;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//&#198;&#213;í¨ê&#228;3&#246;&#196;£ê&#189;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//í&#198;íìê&#228;3&#246;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//
  GPIO_Init(GPIOA, &GPIO_InitStructure);//3&#245;ê&#188;&#187;ˉ
        IIC_SDA_ON;                    
        IIC_SCL_ON;
}
//2úéúIIC&#198;eê&#188;D&#197;o&#197;
void IIC_Start(void)
{
        SDA_OUT();     //sda&#207;&#223;ê&#228;3&#246;
        IIC_SDA_ON;                    
        IIC_SCL_ON;

        Delayus(130);//4us
        IIC_SDA_OFF;//START:when CLK is high,DATA change form high to low
       
        Delayus(130);
        IIC_SCL_OFF;
        //&#199;ˉ×&#161;I2C×ü&#207;&#223;£&#172;×&#188;±&#184;·¢&#203;í&#187;ò&#189;óê&#213;êy&#190;Y
}          
//2úéúIICí£&#214;1D&#197;o&#197;
void IIC_Stop(void)
{
        SDA_OUT();//sda&#207;&#223;ê&#228;3&#246;
        IIC_SCL_OFF;
        IIC_SDA_OFF;//STOP:when CLK is high DATA change form low to high
        Delayus(130);
        IIC_SCL_ON;
        IIC_SDA_ON;//·¢&#203;íI2C×ü&#207;&#223;&#189;áê&#248;D&#197;o&#197;
        Delayus(130);                                                                  
}
//μè′yó|′eD&#197;o&#197;μ&#189;à′
//·μ&#187;&#216;&#214;μ£o1£&#172;&#189;óê&#213;ó|′eê§°ü
//        0£&#172;&#189;óê&#213;ó|′e3é1|
uint8_t IIC_Wait_Ack(void)
{
        uint8_t ack;
        uint32_t ucErrTime=0;
       
        IIC_SDA_ON;
        Delayus(500);         
        IIC_SCL_ON;
        Delayus(130);         
  
        SDA_IN();      //SDAéè&#214;&#195;&#206;aê&#228;è&#235;  
        while(IIC_SDA_IN)
        {
                ucErrTime++;
                if(ucErrTime>2500)
                {
                        //IIC_Stop();
                        return 1;
                }
        }
        IIC_SCL_OFF;//ê±&#214;óê&#228;3&#246;0           
        Delayus(130);         
        return 0;  
//        ack = (IIC_SDA_IN);                       // Read ACK state from Slave
//  IIC_SCL_OFF;                                    // SCL = 0
//  if (ack)                                  // Return ACK state to calling app
//    return (1);
//  else
//    return (0);
}
//2úéúACKó|′e
void IIC_Ack(void)
{
        IIC_SCL_OFF;
        SDA_OUT();
        IIC_SDA_OFF;
        Delayus(130);
        IIC_SCL_ON;
        Delayus(130);
        IIC_SCL_OFF;
}
//2&#187;2úéúACKó|′e                    
void IIC_NAck(void)
{
        IIC_SCL_OFF;
        SDA_OUT();
        IIC_SDA_ON;
        Delayus(130);
        IIC_SCL_ON;
        Delayus(130);
        IIC_SCL_OFF;
}                                                                              
//IIC·¢&#203;íò&#187;&#184;&#246;×&#214;&#189;ú
//·μ&#187;&#216;′ó&#187;úóD&#206;Tó|′e
//1£&#172;óDó|′e
//0£&#172;&#206;Tó|′e                          
void IIC_Send_Byte(uint8_t txd)
{                        
    uint8_t t;   
          SDA_OUT();             
    IIC_SCL_OFF;//à-μíê±&#214;ó&#191;aê&#188;êy&#190;Y′&#171;ê&#228;
    for(t=0;t<8;t++)
    {              
                        if((txd&0x80)>>7)
                        {
                                IIC_SDA_ON;
                        }
                        else
                        {
                                IIC_SDA_OFF;
                        }

        txd<<=1;           
                Delayus(65);   //&#182;&#212;TEA5767&#213;aèy&#184;&#246;&#209;óê±&#182;&#188;ê&#199;±&#216;D&#235;μ&#196;
                IIC_SCL_ON;
                Delayus(130);
                IIC_SCL_OFF;       
                Delayus(65);
    }                
               
}             
//&#182;á1&#184;&#246;×&#214;&#189;ú£&#172;ack=1ê±£&#172;·¢&#203;íACK£&#172;ack=0£&#172;·¢&#203;ínACK   
uint8_t 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_OFF;
                Delayus(130);
                IIC_SCL_ON;
                receive<<=1;
                if(IIC_SDA_IN)receive++;   
                Delayus(130);
  }                                         
    if (!ack)
        IIC_NAck();//·¢&#203;ínACK
    else
        IIC_Ack(); //·¢&#203;íACK   
    return receive;
}



























怕水的鱼
2楼-- · 2019-08-14 12:33
怎么没有人啊
怕水的鱼
3楼-- · 2019-08-14 14:18
 精彩回答 2  元偷偷看……
huanghan
4楼-- · 2019-08-14 18:46
本帖最后由 huanghan 于 2017-9-1 11:22 编辑
怕水的鱼 发表于 2017-9-1 10:58
给点建议啊 大神们

应答有是有的吧,
不行就不要用模拟,用I2C模块
怕水的鱼
5楼-- · 2019-08-15 00:11
huanghan 发表于 2017-9-1 11:14
应答有是有的吧,

等待应答的就是第九个时钟啊
huanghan
6楼-- · 2019-08-15 05:32
本帖最后由 huanghan 于 2017-9-1 11:47 编辑
怕水的鱼 发表于 2017-9-1 11:16
等待应答的就是第九个时钟啊

没有看出来哪里混乱,是你看了吧,为什么接收应答要那么长时间,应该看这函,是这个函里里Delayus()产生的
uint8_t IIC_Wait_Ack(void)
{
        uint8_t ack;
        uint32_t ucErrTime=0;
        
        IIC_SDA_ON;
        Delayus(500);         //
        IIC_SCL_ON;
        Delayus(130);         
  
        SDA_IN();      //SDAéè&#214;&#195;&#206;aê&#228;è&#235;  
        while(IIC_SDA_IN)
        {
                ucErrTime++;
                if(ucErrTime>2500)
                {
                        //IIC_Stop();
                        return 1;
                }
        }
        IIC_SCL_OFF;//ê±&#214;óê&#228;3&#246;0            
        Delayus(130);         
        return 0;  
//        ack = (IIC_SDA_IN);                       // Read ACK state from Slave
//  IIC_SCL_OFF;                                    // SCL = 0
//  if (ack)                                  // Return ACK state to calling app
//    return (1);
//  else
//    return (0);
}

一周热门 更多>