//读OV7660寄存器 u8 OV_ReadReg(u8 regID, u8 *regDat) { //通过写操作设置寄存器地址 SCCB_Start(); if(SCCB_Write(0x42))//写地址 { SCCB_Stop();//发送SCCB 总线停止传输命令 return 1;//错误返回 } delay_us(10); if(SCCB_Write(regID))//积存器ID { SCCB_Stop();//发送SCCB 总线停止传输命令 return 2;//错误返回 } SCCB_Stop();//发送SCCB 总线停止传输命令 delay_us(10); //设置寄存器地址后,才是读 SCCB_Start(); if(SCCB_Write(0x43))//读地址 { SCCB_Stop();//发送SCCB 总线停止传输命令 return 3;//错误返回 } delay_us(10); *regDat=SCCB_Read();//返回读到的值 noAck();//发送NACK命令 SCCB_Stop();//发送SCCB 总线停止传输命令 return 0;//成功返回 }
/** * @brief Read data form specific register in Camera Module OV7670 * @param Address: address of register in Camera Module * @retval ReturnState.Data -> Return read data from register * ReturnState.State -> Return state of the transmission */ ReturnState *Camera_ReadReg(uint8_t Address) { ReturnState returnState; // Structure for return Data and State (Success/Error) returnState.Data = 0x00; returnState.State = ERROR; // Create start condition on SCCB/I2C interface SCCB_Start(); // Write data (Address of slave device for Write) on SCCB/I2C interface if(Error == (SCCB_Write(WriteAddress))) { SCCB_Stop(); // Create stop condition on SCCB/I2C interface return(&returnState); // Return error and cancel the communication } Delay_us(100); // Write data (Address of register in Camera Module)on SCCB/I2C interface if(Error == (SCCB_Write(Address))) { SCCB_Stop(); // Create stop condition on SCCB/I2C interface return(&returnState); // Return error and cancel the communication } // Create stop condition on SCCB/I2C interface SCCB_Stop(); // Delay for SCCB/I2C Delay_us(100); // Create start condition on SCCB/I2C interface SCCB_Start(); // Write data (Address of slave device for Read) on SCCB/I2C interface if(Error == (SCCB_Write(ReadAddress))) { SCCB_Stop(); // Create stop condition on SCCB/I2C interface return(&returnState); // Return error and cancel the communication } Delay_us(500); // Received data from Camera Module (SCCB/I2C) returnState.Data = SCCB_Read(); // No acknowlage on SCCB/I2C interface NoAck(); // Create stop condition on SCCB/I2C interface SCCB_Stop(); // If everything is done correct return success returnState.State = SUCCESS; return(&returnState); }
/** * @brief Write data to specific register in Camera Module OV7670 * @param Address: address of register * Value: value of data to be written into register * @retval ERROR, SUCCESS */ ErrorStatus Camera_WriteReg(uint8_t Address, uint8_t Value) { // Create start condition on SCCB/I2C interface SCCB_Start(); // Write data (Address of slave device for Write) on SCCB/I2C interface if((SCCB_Write(WriteAddress)) == Error) { SCCB_Stop(); // Create stop condition on SCCB/I2C interface return(ERROR); // Return error and cancel the communication } Delay_us(100); // Write data (Address of register in Camera Module)on SCCB/I2C interface if((SCCB_Write(Address)) == Error) { SCCB_Stop(); // Create stop condition on SCCB/I2C interface return(ERROR); // Return error and cancel the communication } // Write data (Data to write into register in Camera Module)on SCCB/I2C interface if((SCCB_Write(Value)) == Error) { SCCB_Stop(); // Create stop condition on SCCB/I2C interface return(ERROR); // Return error and cancel the communication } // Create stop condition on SCCB/I2C interface SCCB_Stop(); return(SUCCESS); }
void SCCB_Bytewrite(unsigned char device,unsigned char address,unsigned char data) { unsigned char i; unsigned char ack; for(i=0;i<20;i++) { SCCB_Start(); ack=SCCB_Sendbyte(device); if(ack) { SCCB_Stop(); continue; } ack=SCCB_Sendbyte(address); if(ack) { SCCB_Stop(); continue; } ack=SCCB_Sendbyte(data); if(ack) { SCCB_Stop(); continue; } SCCB_Stop(); if(ack==0) break; } }
int SCCB_ReadByte_one(uint8 *pBuffer, uint16 length, uint8 ReadAddress) { if(!SCCB_Start()) { return 0; } SCCB_SendByte( DEV_ADR ); /* 器件地址 */ if( !SCCB_WaitAck() ) { SCCB_Stop(); return 0; } SCCB_SendByte( ReadAddress ); /* 设置低起始地址 */ SCCB_WaitAck(); SCCB_Stop(); if(!SCCB_Start()) { return 0; } SCCB_SendByte( DEV_ADR + 1 ); /* 器件地址 */ if(!SCCB_WaitAck()) { SCCB_Stop(); return 0; } while(length) { *pBuffer = SCCB_ReceiveByte(); if(length == 1) { SCCB_NoAck(); } else { SCCB_Ack(); } pBuffer++; length--; } SCCB_Stop(); return 1; }
int SCCB_WriteByte_one( uint16 WriteAddress , uint8 SendByte ) { if(!SCCB_Start()) { return 0; } SCCB_SendByte( DEV_ADR ); /* 器件地址 */ if( !SCCB_WaitAck() ) { SCCB_Stop(); return 0; } SCCB_SendByte((uint8)(WriteAddress & 0x00FF)); /* 设置低起始地址 */ SCCB_WaitAck(); SCCB_SendByte(SendByte); SCCB_WaitAck(); SCCB_Stop(); return 1; }
/* 函数名:SCCB_WriteByte * 描述 :写一字节数据 * 输入 :- WriteAddress: 待写入地址 - SendByte: 待写入数据 - DeviceAddress: 器件类型 * 输出 :返回为:=1成功写入,=0失败 * 注意 :无 */ int SCCB_WriteByte( uint16_t WriteAddress , uint8_t SendByte ) { if(!SCCB_Start()) { return DISABLE; } SCCB_SendByte( DEV_ADR ); /* 器件地址 */ if( !SCCB_WaitAck() ) { SCCB_Stop(); return DISABLE; } SCCB_SendByte((uint8_t)(WriteAddress & 0x00FF)); /* 设置低起始地址 */ SCCB_WaitAck(); SCCB_SendByte(SendByte); SCCB_WaitAck(); SCCB_Stop(); return ENABLE; }
//写OV7670寄存器 u8 OV_WriteReg(u8 regID, u8 regDat) { SCCB_Start();//发送SCCB 总线开始传输命令 if(SCCB_Write(0x42))//写地址 { SCCB_Stop();//发送SCCB 总线停止传输命令 return 1;//错误返回 } delay_us(10); if(SCCB_Write(regID))//寄存器ID { SCCB_Stop();//发送SCCB 总线停止传输命令 return 2;//错误返回 } delay_us(10); if(SCCB_Write(regDat))//写数据到积存器 { SCCB_Stop();//发送SCCB 总线停止传输命令 return 3;//错误返回 } SCCB_Stop();//发送SCCB 总线停止传输命令 return 0;//成功返回 }