找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3096|回复: 0
打印 上一主题 下一主题
收起左侧

stm32 关于0v7670的源程序

[复制链接]
跳转到指定楼层
楼主
ID:225622 发表于 2017-8-7 22:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    SCCB_SDA=0;
    delay_us(50);         
    SCCB_SCL=0;            //数据线恢复低电平,单操作函数必要          
}

//SCCB停止信号
//当时钟为高的时候,数据线的低到高,为SCCB停止信号
//空闲状况下,SDA,SCL均为高电平
void SCCB_Stop(void)
{
    SCCB_SDA=0;
    delay_us(50);         
    SCCB_SCL=1;       
    delay_us(50);
    SCCB_SDA=1;       
    delay_us(50);
}  
//产生NA信号
void SCCB_No_Ack(void)
{
        delay_us(50);
        SCCB_SDA=1;       
        SCCB_SCL=1;       
        delay_us(50);
        SCCB_SCL=0;       
        delay_us(50);
        SCCB_SDA=0;       
        delay_us(50);
}
//SCCB,写入一个字节
//返回值:0,成功;1,失败.
u8 SCCB_WR_Byte(u8 dat)
{
        u8 j,res;         
        for(j=0;j<8;j++) //循环8次发送数据
        {
                if(dat&0x80)SCCB_SDA=1;       
                else SCCB_SDA=0;
                dat<<=1;
                delay_us(50);
                SCCB_SCL=1;       
                delay_us(50);
                SCCB_SCL=0;                  
        }                         
        SCCB_SDA_IN();                //设置SDA为输入
        delay_us(50);
        SCCB_SCL=1;                        //接收第九位,以判断是否发送成功
        delay_us(50);
        if(SCCB_READ_SDA)res=1;  //SDA=1发送失败,返回1
        else res=0;         //SDA=0发送成功,返回0
        SCCB_SCL=0;                 
        SCCB_SDA_OUT();                //设置SDA为输出   
        return res;  
}         
//SCCB 读取一个字节
//在SCL的上升沿,数据锁存
//返回值:读到的数据
u8 SCCB_RD_Byte(void)
{
        u8 temp=0,j;   
        SCCB_SDA_IN();                //设置SDA为输入  
        for(j=8;j>0;j--)         //循环8次接收数据
        {                               
                delay_us(50);
                SCCB_SCL=1;
                temp=temp<<1;
                if(SCCB_READ_SDA)temp++;   
                delay_us(50);
                SCCB_SCL=0;
        }       
        SCCB_SDA_OUT();                //设置SDA为输出   
        return temp;
}                                                             
//写寄存器
//返回值:0,成功;1,失败.
u8 SCCB_WR_Reg(u8 reg,u8 data)
{
        u8 res=0;
        SCCB_Start();                                         //启动SCCB传输
        if(SCCB_WR_Byte(SCCB_ID))res=1;        //写器件ID          
        delay_us(100);
          if(SCCB_WR_Byte(reg))res=1;                //写寄存器地址          
        delay_us(100);
          if(SCCB_WR_Byte(data))res=1;         //写数据         
          SCCB_Stop();          
          return        res;
}                                                              
//读寄存器
//返回值:读到的寄存器值
u8 SCCB_RD_Reg(u8 reg)
{
        u8 val=0;
        SCCB_Start();                                 //启动SCCB传输
        SCCB_WR_Byte(SCCB_ID);                //写器件ID          
        delay_us(100);         
          SCCB_WR_Byte(reg);                        //写寄存器地址          
        delay_us(100);          
        SCCB_Stop();   
        delay_us(100);          
        //设置寄存器地址后,才是读
        SCCB_Start();
        SCCB_WR_Byte(SCCB_ID|0X01);        //发送读命令          
        delay_us(100);
          val=SCCB_RD_Byte();                         //读取数据
          SCCB_No_Ack();
          SCCB_Stop();
          return val;
}
















分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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