133 lines
3.8 KiB
C
133 lines
3.8 KiB
C
|
/**
|
|||
|
******************************************************************************
|
|||
|
* @file i2c.c
|
|||
|
* @author fire
|
|||
|
* @version V1.0
|
|||
|
* @date 2015-xx-xx
|
|||
|
* @brief i2c <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I2C<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨѶ<EFBFBD><EFBFBD>
|
|||
|
******************************************************************************
|
|||
|
* @attention
|
|||
|
*
|
|||
|
* ʵ<EFBFBD><EFBFBD>ƽ̨:<EFBFBD><EFBFBD><EFBFBD><EFBFBD> STM32 H743 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* <EFBFBD><EFBFBD>̳ :http://www.firebbs.cn
|
|||
|
* <EFBFBD>Ա<EFBFBD> :http://firestm32.taobao.com
|
|||
|
*
|
|||
|
******************************************************************************
|
|||
|
*/
|
|||
|
#include "./i2c/bsp_i2c.h"
|
|||
|
|
|||
|
|
|||
|
I2C_HandleTypeDef I2C_Handle;
|
|||
|
/******************************* Function ************************************/
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>I2C<EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD>ʹ<EFBFBD><EFBFBD>I2Cǰ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param <EFBFBD><EFBFBD>
|
|||
|
* @retval <EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
void I2CMaster_Init(void)
|
|||
|
{
|
|||
|
GPIO_InitTypeDef GPIO_InitStructure;
|
|||
|
|
|||
|
/* ʹ<><CAB9>I2Cxʱ<78><CAB1> */
|
|||
|
SENSORS_I2C_RCC_CLK_ENABLE();
|
|||
|
|
|||
|
/* ʹ<><CAB9>I2C GPIO ʱ<><CAB1> */
|
|||
|
SENSORS_I2C_SCL_GPIO_CLK_ENABLE();
|
|||
|
SENSORS_I2C_SDA_GPIO_CLK_ENABLE();
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>I2Cx<43><78><EFBFBD><EFBFBD>: SCL ----------------------------------------*/
|
|||
|
GPIO_InitStructure.Pin = SENSORS_I2C_SCL_GPIO_PIN;
|
|||
|
GPIO_InitStructure.Mode = GPIO_MODE_AF_OD;
|
|||
|
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
|
|||
|
GPIO_InitStructure.Pull= GPIO_NOPULL;
|
|||
|
GPIO_InitStructure.Alternate=SENSORS_I2C_AF;
|
|||
|
HAL_GPIO_Init(SENSORS_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>I2Cx<43><78><EFBFBD><EFBFBD>: SDA ----------------------------------------*/
|
|||
|
GPIO_InitStructure.Pin = SENSORS_I2C_SDA_GPIO_PIN;
|
|||
|
HAL_GPIO_Init(SENSORS_I2C_SDA_GPIO_PORT, &GPIO_InitStructure);
|
|||
|
|
|||
|
if(HAL_I2C_GetState(&I2C_Handle) == HAL_I2C_STATE_RESET)
|
|||
|
{
|
|||
|
/* ǿ<>Ƹ<EFBFBD>λI2C<32><43><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> */
|
|||
|
SENSORS_I2C_FORCE_RESET();
|
|||
|
|
|||
|
/* <20>ͷ<EFBFBD>I2C<32><43><EFBFBD><EFBFBD>ʱ<EFBFBD>Ӹ<EFBFBD>λ */
|
|||
|
SENSORS_I2C_RELEASE_RESET();
|
|||
|
|
|||
|
/* I2C <20><><EFBFBD><EFBFBD> */
|
|||
|
I2C_Handle.Instance = SENSORS_I2C;
|
|||
|
I2C_Handle.Init.Timing = 0x40604E73;//100KHz
|
|||
|
I2C_Handle.Init.OwnAddress1 = 0;
|
|||
|
I2C_Handle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
|
|||
|
I2C_Handle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
|
|||
|
I2C_Handle.Init.OwnAddress2 = 0;
|
|||
|
I2C_Handle.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
|
|||
|
I2C_Handle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
|
|||
|
I2C_Handle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
|
|||
|
|
|||
|
/* <20><>ʼ<EFBFBD><CABC>I2C */
|
|||
|
HAL_I2C_Init(&I2C_Handle);
|
|||
|
/* ʹ<><CAB9>ģ<EFBFBD><C4A3><EFBFBD>˲<EFBFBD><CBB2><EFBFBD> */
|
|||
|
HAL_I2CEx_AnalogFilter_Config(&I2C_Handle, I2C_ANALOGFILTER_ENABLE);
|
|||
|
}
|
|||
|
}
|
|||
|
/**
|
|||
|
* @brief Manages error callback by re-initializing I2C.
|
|||
|
* @param Addr: I2C Address
|
|||
|
* @retval None
|
|||
|
*/
|
|||
|
static void I2Cx_Error(void)
|
|||
|
{
|
|||
|
/* <20>ָ<EFBFBD>I2C<32>Ĵ<EFBFBD><C4B4><EFBFBD>ΪĬ<CEAA><C4AC>ֵ */
|
|||
|
HAL_I2C_DeInit(&I2C_Handle);
|
|||
|
/* <20><><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC>I2C<32><43><EFBFBD><EFBFBD> */
|
|||
|
I2CMaster_Init();
|
|||
|
}
|
|||
|
/**
|
|||
|
* @brief дһ<EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>OV2640<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param Addr: OV2640 <EFBFBD>ļĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
* @param Data: Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @retval <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>ʾд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0xFF<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
uint8_t OV2640_WriteReg(uint16_t Addr, uint8_t Data)
|
|||
|
{
|
|||
|
// I2Cx_WriteMultiple(&I2C_Handle, OV2640_DEVICE_WRITE_ADDRESS, (uint16_t)Addr, I2C_MEMADD_SIZE_8BIT,(uint8_t*)&Data, 1);
|
|||
|
HAL_StatusTypeDef status = HAL_OK;
|
|||
|
|
|||
|
status = HAL_I2C_Mem_Write(&I2C_Handle, OV2640_DEVICE_ADDRESS, (uint16_t)Addr, I2C_MEMADD_SIZE_8BIT, (uint8_t*)&Data, 1, 1000);
|
|||
|
|
|||
|
/* Check the communication status */
|
|||
|
if(status != HAL_OK)
|
|||
|
{
|
|||
|
/* Re-Initiaize the I2C Bus */
|
|||
|
I2Cx_Error();
|
|||
|
}
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief <EFBFBD><EFBFBD>OV2640<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ȡһ<EFBFBD><EFBFBD><EFBFBD>ֽڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* @param Addr: <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
|||
|
* @retval <EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD>ȡ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
uint8_t OV2640_ReadReg(uint16_t Addr)
|
|||
|
{
|
|||
|
uint8_t Data = 0;
|
|||
|
// I2Cx_ReadMultiple(&I2C_Handle, OV2640_DEVICE_READ_ADDRESS, Addr, I2C_MEMADD_SIZE_8BIT, (uint8_t*)&Data, 1);
|
|||
|
|
|||
|
HAL_StatusTypeDef status = HAL_OK;
|
|||
|
|
|||
|
status = HAL_I2C_Mem_Read(&I2C_Handle, OV2640_DEVICE_ADDRESS, (uint16_t)Addr, I2C_MEMADD_SIZE_8BIT, (uint8_t*)&Data, 1, 1000);
|
|||
|
|
|||
|
/* Check the communication status */
|
|||
|
if(status != HAL_OK)
|
|||
|
{
|
|||
|
/* I2C error occurred */
|
|||
|
I2Cx_Error();
|
|||
|
}
|
|||
|
/* return the read data */
|
|||
|
return Data;
|
|||
|
}
|