|
|
|
|
#include "ctiic.h"
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD>ѧϰʹ<EFBFBD>ã<EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD>;
|
|
|
|
|
//ALIENTEK STM32F407<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
//<EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-IIC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD>@ALIENTEK
|
|
|
|
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
|
|
|
|
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2014/5/7
|
|
|
|
|
//<EFBFBD>汾<EFBFBD><EFBFBD>V1.1
|
|
|
|
|
//<EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
//Copyright(C) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˾ 2014-2024
|
|
|
|
|
//All rights reserved
|
|
|
|
|
//********************************************************************************
|
|
|
|
|
//<EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>
|
|
|
|
|
//V1.1 20140721
|
|
|
|
|
//1,<EFBFBD><EFBFBD>CT_IIC_Read_Byte<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
//2,<EFBFBD><EFBFBD>CT_IIC_Wait_Ack<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD>MDK<EFBFBD><EFBFBD>-O2<EFBFBD>Ż<EFBFBD>.
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>I2C<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>GPIO<EFBFBD>˿<EFBFBD>, <EFBFBD>û<EFBFBD>ֻ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>д<EFBFBD><EFBFBD>뼴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>SCL<EFBFBD><EFBFBD>SDA<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: bsp_InitI2C
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>I2C<EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>GPIO<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>IO<EFBFBD>ķ<EFBFBD>ʽʵ<EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ֵ: <EFBFBD><EFBFBD>
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
*/
|
|
|
|
|
void CT_IIC_Init(void)
|
|
|
|
|
{
|
|
|
|
|
GPIO_InitTypeDef GPIO_InitStructure;
|
|
|
|
|
|
|
|
|
|
RCC_APB2PeriphClockCmd(RCC_I2C_PORT, ENABLE); /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>GPIOʱ<EFBFBD><EFBFBD> */
|
|
|
|
|
|
|
|
|
|
GPIO_InitStructure.GPIO_Pin = I2C_SDA_PIN | I2C_SCL_PIN;
|
|
|
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
|
|
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
|
|
|
|
|
GPIO_Init(GPIO_PORT_I2C, &GPIO_InitStructure);
|
|
|
|
|
|
|
|
|
|
/* <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ֹͣ<EFBFBD>ź<EFBFBD>, <EFBFBD><EFBFBD>λI2C<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ */
|
|
|
|
|
CT_IIC_Stop();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: i2c_Delay
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: I2C<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ӳ٣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>400KHz
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ֵ: <EFBFBD><EFBFBD>
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
*/
|
|
|
|
|
static void i2c_Delay(void)
|
|
|
|
|
{
|
|
|
|
|
uint8_t i;
|
|
|
|
|
|
|
|
|
|
/*<EFBFBD><EFBFBD>
|
|
|
|
|
CPU<EFBFBD><EFBFBD>Ƶ168MHzʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>Flash<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, MDK<EFBFBD><EFBFBD><EFBFBD>̲<EFBFBD><EFBFBD>Ż<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨ʽʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۲Ⲩ<EFBFBD>Ρ<EFBFBD>
|
|
|
|
|
ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ5ʱ<EFBFBD><EFBFBD>SCLƵ<EFBFBD><EFBFBD> = 1.78MHz (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ: 92ms, <EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̽ͷ<EFBFBD><EFBFBD><EFBFBD>ϾͶ<EFBFBD>дʧ<EFBFBD>ܡ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><EFBFBD>ٽ<EFBFBD>)
|
|
|
|
|
ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ10ʱ<EFBFBD><EFBFBD>SCLƵ<EFBFBD><EFBFBD> = 1.1MHz (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ: 138ms, <EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>: 118724B/s)
|
|
|
|
|
ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ30ʱ<EFBFBD><EFBFBD>SCLƵ<EFBFBD><EFBFBD> = 440KHz<EFBFBD><EFBFBD> SCL<EFBFBD>ߵ<EFBFBD>ƽʱ<EFBFBD><EFBFBD>1.0us<EFBFBD><EFBFBD>SCL<EFBFBD>͵<EFBFBD>ƽʱ<EFBFBD><EFBFBD>1.2us
|
|
|
|
|
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>2.2Kŷʱ<EFBFBD><EFBFBD>SCL<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Լ0.5us<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ4.7Kŷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ1us
|
|
|
|
|
|
|
|
|
|
ʵ<EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>400KHz<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
// for (i = 0; i < 5; i++);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: CT_IIC_Start
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>I2C<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ֵ: <EFBFBD><EFBFBD>
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
*/
|
|
|
|
|
void CT_IIC_Start(void)
|
|
|
|
|
{
|
|
|
|
|
/* <EFBFBD><EFBFBD>SCL<EFBFBD>ߵ<EFBFBD>ƽʱ<EFBFBD><EFBFBD>SDA<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>ʾI2C<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD> */
|
|
|
|
|
I2C_SDA_1();
|
|
|
|
|
I2C_SCL_1();
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
I2C_SDA_0();
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
I2C_SCL_0();
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: CT_IIC_Start
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>I2C<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ<EFBFBD>ź<EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ֵ: <EFBFBD><EFBFBD>
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
*/
|
|
|
|
|
void CT_IIC_Stop(void)
|
|
|
|
|
{
|
|
|
|
|
/* <EFBFBD><EFBFBD>SCL<EFBFBD>ߵ<EFBFBD>ƽʱ<EFBFBD><EFBFBD>SDA<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>ʾI2C<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ<EFBFBD>ź<EFBFBD> */
|
|
|
|
|
I2C_SDA_0();
|
|
|
|
|
I2C_SCL_1();
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
I2C_SDA_1();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: CT_IIC_Send_Byte
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: CPU<EFBFBD><EFBFBD>I2C<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>8bit<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: _ucByte <EFBFBD><EFBFBD> <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD>ֽ<EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ֵ: <EFBFBD><EFBFBD>
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
*/
|
|
|
|
|
void CT_IIC_Send_Byte(uint8_t _ucByte)
|
|
|
|
|
{
|
|
|
|
|
uint8_t i;
|
|
|
|
|
|
|
|
|
|
/* <EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڵĸ<EFBFBD>λbit7 */
|
|
|
|
|
for (i = 0; i < 8; i++)
|
|
|
|
|
{
|
|
|
|
|
if (_ucByte & 0x80)
|
|
|
|
|
{
|
|
|
|
|
I2C_SDA_1();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
I2C_SDA_0();
|
|
|
|
|
}
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
I2C_SCL_1();
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
I2C_SCL_0();
|
|
|
|
|
if (i == 7)
|
|
|
|
|
{
|
|
|
|
|
I2C_SDA_1(); // <EFBFBD>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
}
|
|
|
|
|
_ucByte <<= 1; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>bit */
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: CT_IIC_Read_Byte
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: CPU<EFBFBD><EFBFBD>I2C<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD>ȡ8bit<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ֵ: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
*/
|
|
|
|
|
uint8_t CT_IIC_Read_Byte(unsigned char ack)
|
|
|
|
|
{
|
|
|
|
|
uint8_t i;
|
|
|
|
|
uint8_t value;
|
|
|
|
|
|
|
|
|
|
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>bitΪ<EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>bit7 */
|
|
|
|
|
value = 0;
|
|
|
|
|
for (i = 0; i < 8; i++)
|
|
|
|
|
{
|
|
|
|
|
value <<= 1;
|
|
|
|
|
I2C_SCL_1();
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
if (I2C_SDA_READ())
|
|
|
|
|
{
|
|
|
|
|
value++;
|
|
|
|
|
}
|
|
|
|
|
I2C_SCL_0();
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ack)
|
|
|
|
|
CT_IIC_NAck();//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>nACK
|
|
|
|
|
else
|
|
|
|
|
CT_IIC_Ack(); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ACK
|
|
|
|
|
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: CT_IIC_Wait_Ack
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ʱ<EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ACKӦ<EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ֵ: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>ȷӦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
*/
|
|
|
|
|
uint8_t CT_IIC_Wait_Ack(void)
|
|
|
|
|
{
|
|
|
|
|
uint8_t re;
|
|
|
|
|
|
|
|
|
|
I2C_SDA_1(); /* CPU<EFBFBD>ͷ<EFBFBD>SDA<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
I2C_SCL_1(); /* CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>SCL = 1, <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>᷵<EFBFBD><EFBFBD>ACKӦ<EFBFBD><EFBFBD> */
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
if (I2C_SDA_READ()) /* CPU<EFBFBD><EFBFBD>ȡSDA<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
|
|
|
|
|
{
|
|
|
|
|
re = 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
re = 0;
|
|
|
|
|
}
|
|
|
|
|
I2C_SCL_0();
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
return re;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: CT_IIC_Ack
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ACK<EFBFBD>ź<EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ֵ: <EFBFBD><EFBFBD>
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
*/
|
|
|
|
|
void CT_IIC_Ack(void)
|
|
|
|
|
{
|
|
|
|
|
I2C_SDA_0(); /* CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>SDA = 0 */
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
I2C_SCL_1(); /* CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> */
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
I2C_SCL_0();
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
I2C_SDA_1(); /* CPU<EFBFBD>ͷ<EFBFBD>SDA<EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: CT_IIC_NAck
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>NACK<EFBFBD>ź<EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ֵ: <EFBFBD><EFBFBD>
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
*/
|
|
|
|
|
void CT_IIC_NAck(void)
|
|
|
|
|
{
|
|
|
|
|
I2C_SDA_1(); /* CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>SDA = 1 */
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
I2C_SCL_1(); /* CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> */
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
I2C_SCL_0();
|
|
|
|
|
i2c_Delay();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: CT_IIC_CheckDevice
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>I2C<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD>CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>豸Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϸ<EFBFBD><EFBFBD>豸<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: _Address<EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD>I2C<EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ַ
|
|
|
|
|
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ֵ: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ 0 <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>ʾδ̽<EFBFBD>
|
|
|
|
|
*********************************************************************************************************
|
|
|
|
|
*/
|
|
|
|
|
uint8_t IIC_CheckDevice(uint8_t _Address)
|
|
|
|
|
{
|
|
|
|
|
uint8_t ucAck;
|
|
|
|
|
|
|
|
|
|
if (I2C_SDA_READ() && I2C_SCL_READ())
|
|
|
|
|
{
|
|
|
|
|
CT_IIC_Start(); /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD> */
|
|
|
|
|
|
|
|
|
|
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD>ַ+<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>bit<EFBFBD><EFBFBD>0 = w<EFBFBD><EFBFBD> 1 = r) bit7 <EFBFBD>ȴ<EFBFBD> */
|
|
|
|
|
CT_IIC_Send_Byte((_Address<<1) | I2C_WR);
|
|
|
|
|
ucAck = CT_IIC_Wait_Ack(); /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD>ACKӦ<EFBFBD><EFBFBD> */
|
|
|
|
|
|
|
|
|
|
CT_IIC_Stop(); /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ<EFBFBD>ź<EFBFBD> */
|
|
|
|
|
|
|
|
|
|
return ucAck;
|
|
|
|
|
}
|
|
|
|
|
return 1; /* I2C<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>쳣 */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
u8 IIC_WriteByte(u8 add,u8 reg,u8 dat)//1100,100 1 0110 0100 0x64
|
|
|
|
|
{
|
|
|
|
|
CT_IIC_Start(); /* <EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD>ʼ<EFBFBD>ź<EFBFBD> */
|
|
|
|
|
|
|
|
|
|
CT_IIC_Send_Byte(add<<1); /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD>ַ+д<EFBFBD>ź<EFBFBD> */
|
|
|
|
|
if(CT_IIC_Wait_Ack())
|
|
|
|
|
{
|
|
|
|
|
CT_IIC_Stop();
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CT_IIC_Send_Byte(reg); /* <EFBFBD>ڲ<EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ */
|
|
|
|
|
CT_IIC_Wait_Ack();
|
|
|
|
|
|
|
|
|
|
CT_IIC_Send_Byte(dat); /* <EFBFBD>ڲ<EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
if(CT_IIC_Wait_Ack())
|
|
|
|
|
{
|
|
|
|
|
CT_IIC_Stop();
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CT_IIC_Stop();
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
u8 IIC_ReadByte(u8 add,u8 reg)
|
|
|
|
|
{
|
|
|
|
|
uint8_t ucData;
|
|
|
|
|
|
|
|
|
|
CT_IIC_Start(); /* <EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD>ʼ<EFBFBD>ź<EFBFBD> */
|
|
|
|
|
CT_IIC_Send_Byte(add<<1); /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD>ַ+д<EFBFBD>ź<EFBFBD> */
|
|
|
|
|
CT_IIC_Wait_Ack();
|
|
|
|
|
CT_IIC_Send_Byte(reg); /* <EFBFBD><EFBFBD><EFBFBD>ʹ洢<EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>ַ */
|
|
|
|
|
CT_IIC_Wait_Ack();
|
|
|
|
|
|
|
|
|
|
CT_IIC_Start(); /* <EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD>ʼ<EFBFBD>ź<EFBFBD> */
|
|
|
|
|
|
|
|
|
|
CT_IIC_Send_Byte((add<<1)|1); /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><EFBFBD>ַ+<EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD> */
|
|
|
|
|
CT_IIC_Wait_Ack();
|
|
|
|
|
|
|
|
|
|
ucData = CT_IIC_Read_Byte(0); /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
|
|
|
|
CT_IIC_Stop(); /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹͣ<EFBFBD>ź<EFBFBD> */
|
|
|
|
|
return ucData;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|