sccb.c
来自「OV7670模组带转接板资料」· C语言 代码 · 共 186 行
C
186 行
#include "SCCB.h"
#include "delay.h"
#include "stm32f10x_lib.h"
/*
-----------------------------------------------
功能: 初始化模拟SCCB接口
参数: 无
返回值: 无
-----------------------------------------------
*/
void SCCB_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOA clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = SCCB_SIC_BIT|SCCB_SID_BIT; //SCCB_SIC_BIT=GPIO_Pin_7; SCCB_SID_BIT=GPIO_Pin_6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO_Mode_AIN = 0x0, //模拟输入
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_10MHz; //GPIO_Mode_IN_FLOATING = 0x04, //悬空输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //GPIO_Mode_IPD = 0x28, //下拉输入
//GPIO_Mode_IPU = 0x48, //上拉输入
//GPIO_Mode_Out_OD = 0x14, //开漏输出
//GPIO_Mode_Out_PP = 0x10, //推挽输出
//GPIO_Mode_AF_OD = 0x1C, //开漏复用
//GPIO_Mode_AF_PP = 0x18 //推挽复用
}
void SCCB_SID_GPIO_OUTPUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOA clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = SCCB_SID_BIT;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void SCCB_SID_GPIO_INPUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOA clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = SCCB_SID_BIT;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*
-----------------------------------------------
功能: start命令,SCCB的起始信号
参数: 无
返回值: 无
-----------------------------------------------
*/
void startSCCB(void)
{
SCCB_SID_H(); //数据线高电平
delay_us(500);
SCCB_SIC_H(); //在时钟线高的时候数据线由高至低
delay_us(500);
SCCB_SID_L();
delay_us(500);
SCCB_SIC_L(); //数据线恢复低电平,单操作函数必要
delay_us(500);
}
/*
-----------------------------------------------
功能: stop命令,SCCB的停止信号
参数: 无
返回值: 无
-----------------------------------------------
*/
void stopSCCB(void)
{
SCCB_SID_L();
delay_us(500);
SCCB_SIC_H();
delay_us(500);
SCCB_SID_H();
delay_us(500);
}
/*
-----------------------------------------------
功能: noAck,用于连续读取中的最后一个结束周期
参数: 无
返回值: 无
-----------------------------------------------
*/
void noAck(void)
{
SCCB_SID_H();
delay_us(500);
SCCB_SIC_H();
delay_us(500);
SCCB_SIC_L();
delay_us(500);
SCCB_SID_L();
delay_us(500);
}
/*
-----------------------------------------------
功能: 写入一个字节的数据到SCCB
参数: 写入数据
返回值: 发送成功返回1,发送失败返回0
-----------------------------------------------
*/
unsigned char SCCBwriteByte(unsigned char m_data)
{
unsigned char j,tem;
for(j=0;j<8;j++) //循环8次发送数据
{
if((m_data<<j)&0x80)
{
SCCB_SID_H();
}
else
{
SCCB_SID_L();
}
delay_us(500);
SCCB_SIC_H();
delay_us(500);
SCCB_SIC_L();
delay_us(500);
}
delay_us(100);
SCCB_SID_IN;/*设置SDA为输入*/
delay_us(500);
SCCB_SIC_H();
delay_us(100);
if(SCCB_SID_STATE){tem=0;} //SDA=1发送失败,返回0}
else {tem=1;} //SDA=0发送成功,返回1
SCCB_SIC_L();
delay_us(500);
SCCB_SID_OUT;/*设置SDA为输出*/
return (tem);
}
/*
-----------------------------------------------
功能: 一个字节数据读取并且返回
参数: 无
返回值: 读取到的数据
-----------------------------------------------
*/
unsigned char SCCBreadByte(void)
{
unsigned char read,j;
read=0x00;
SCCB_SID_IN;/*设置SDA为输入*/
delay_us(500);
for(j=8;j>0;j--) //循环8次接收数据
{
delay_us(500);
SCCB_SIC_H();
delay_us(500);
read=read<<1;
if(SCCB_SID_STATE)
{
read=read+1;
}
SCCB_SIC_L();
delay_us(500);
}
return(read);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?