OpenEdv-开源电子网

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

stm32F0驱动rx8025t只能第一次成功以后不成功

[复制链接]

4

主题

13

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2019-12-4
在线时间
11 小时
发表于 2020-3-10 08:31:03 | 显示全部楼层 |阅读模式
1金钱
iic程序我移植了f1的例程

void SDA_IN(void)
{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

GPIO_Init(GPIOB,&GPIO_InitStructure);

}

void SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
       
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);

}

void IIC_Init(void)
{                                             
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_AHBPeriphClockCmd(        RCC_AHBPeriph_GPIOB, ENABLE );        //使能GPIOB时钟
          
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT ;   //推挽输出
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
}

//产生IIC起始信号
void IIC_Start(void)
{
        SDA_OUT();     //sda线输出
        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;//钳住I2C总线,准备发送或接收数据
}          
//产生IIC停止信号
void IIC_Stop(void)
{
        SDA_OUT();//sda线输出
        IIC_SCL=0;

        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
        delay_us(4);
        IIC_SCL=1;
        delay_us(4);
        IIC_SDA=1;//发送I2C总线结束信号
        delay_us(4);                                                          
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{
        u8 ucErrTime=0;
        delay_us(4);       
        SDA_IN();      //SDA设置为输入
        IIC_SDA=1;
        delay_us(1);          
        IIC_SCL=1;
        delay_us(1);         

        while(READ_SDA)
         {
                 ucErrTime++;
                 if(ucErrTime>250)
                  {
                          IIC_Stop();
                          return 1;
                  }
         }
        IIC_SCL=0;//时钟输出0           
        return 0;  
}
//产生ACK应答
void IIC_Ack(void)
{
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA=0;
        delay_us(2);
        IIC_SCL=1;
        delay_us(2);
        IIC_SCL=0;
}
//不产生ACK应答                    
void IIC_NAck(void)
{
        IIC_SCL=0;
        SDA_OUT();
        IIC_SDA=1;
        delay_us(2);
        IIC_SCL=1;
        delay_us(2);
        IIC_SCL=0;
}                                                                              
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答                          
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
          SDA_OUT();             
    IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
     {              
       IIC_SDA=(txd&0x80)>>7;
       txd<<=1;           
                   delay_us(2);   //对TEA5767这三个延时都是必须的
                   IIC_SCL=1;
                   delay_us(2);
                   IIC_SCL=0;       
                   delay_us(2);
     }         
}             
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
            {
        IIC_SCL=0;
        delay_us(2);
                    IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)
                                        receive++;   
                    delay_us(1);
      }
                       
    if (!ack)
      IIC_NAck();//发送nACK
    else
      IIC_Ack(); //发送ACK   
               
    return receive;       



/*******************************************************************************
* 函数名: u8 Write8025TData(u8 addr, u8 *buf, u8 len)
* 描述  : 写RX8025T寄存器
* 参数  : addr寄存器地址,*buf写入的数据,len写入的长度
* 返回值: 1=操作失败,0=操作成功
*******************************************************************************/
u8 Write8025TData(u8 addr, u8 *buf, u8 len)
{
  uint8_t i;
  IIC_Start();
        IIC_Send_Byte(0x64); //写操作指令
        if(IIC_Wait_Ack())   //检测ACK信号
          {
                  IIC_Stop();         //发送IIC停止信号
                  return 1;       
          }
  IIC_Send_Byte(addr); //写寄存器存储地址
        if(IIC_Wait_Ack())
                {
                        IIC_Stop();
                        return 1;       
                }       
  for(i=0; i<len; i++) //连续写
          {
      IIC_Send_Byte(buf[i]);
                  if(IIC_Wait_Ack())
                                {
                                        IIC_Stop();
                                        return 1;       
                                }               
          }
  IIC_Stop();
        return 0;
}

/*******************************************************************************
* 函数名: u8 Read8025TData(u8 addr,u8 *buf,u8 len)
* 描述  : 读RX8025T寄存器
* 参数  : addr寄存器地址,*buf存储位置,len读取的长度
* 返回值: 1=操作失败,0=操作成功
*******************************************************************************/
u8 Read8025TData(u8 addr,u8 *buf,u8 len)
{
  u8 i;
  IIC_Start();
  IIC_Send_Byte(0x64);  //写操作指令
        if(IIC_Wait_Ack())
                {
                        IIC_Stop();
                        return 1;       
                }       
  IIC_Send_Byte(addr);  //发送寄存器地址
        if(IIC_Wait_Ack())
                {
                        IIC_Stop();
                        return 1;       
                }               
  IIC_Start();          //Sr条件,RESTART
        IIC_Send_Byte(0x65);  //读操作指令
        if(IIC_Wait_Ack())
                {
                        IIC_Stop();
                        return 1;       
                }       
//        IIC_Ack();
        for(i=0; i<len; i++) //连续读
                {
                        buf[i] =IIC_Read_Byte(0);  //读取数据并发送ACK信号
                }
        IIC_NAck();         //发送一个‘1’
  IIC_Stop();
        return 0;
}


       
}

读时候总有问题,只能读取第一次我设置的值




最佳答案

查看完整内容[请看2#楼]

参考这个就看看 http://www.openedv.com/forum.php?mod=viewthread&tid=307017&extra=page%3D1
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

34

主题

322

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1837
金钱
1837
注册时间
2014-12-4
在线时间
717 小时
发表于 2020-3-10 08:31:04 | 显示全部楼层
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14408
金钱
14408
注册时间
2018-8-3
在线时间
1156 小时
发表于 2020-3-10 16:00:08 | 显示全部楼层
是不是用杜邦线接的  建议试下换短一点的线去连接模块 再去读写看看
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-22 09:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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