然后把之前写的 I²C 驱动程序粘过来改一下(^-^)V
//IO方向设置
#define TCS_SDA_DIR_IN()
{TCS_SDA_GPIO->MODER&=~(3<<(TCS_SDA_PIN_NUM*2));TCS_SDA_GPIO>MODER|=0<<TCS_SDA_PIN_NUM*2;}//输入模式
#define TCS_SDA_DIR_OUT()
{TCS_SDA_GPIO->MODER&=~(3<<(TCS_SDA_PIN_NUM*2));TCS_SDA_GPIO>MODER|=1<<TCS_SDA_PIN_NUM*2;}//输出模式
#define TCS_SDA_READ HAL_GPIO_ReadPin(TCS_SDA_GPIO, TCS_SDA_PIN)
#define TCS_SDA_SET HAL_GPIO_WritePin(TCS_SDA_GPIO, TCS_SDA_PIN, GPIO_PIN_SET)
#define TCS_SDA_RESET HAL_GPIO_WritePin(TCS_SDA_GPIO, TCS_SDA_PIN, GPIO_PIN_RESET)
#define TCS_SCL_SET HAL_GPIO_WritePin(TCS_SCL_GPIO, TCS_SCL_PIN, GPIO_PIN_SET)
#define TCS_SCL_RESET HAL_GPIO_WritePin(TCS_SCL_GPIO, TCS_SCL_PIN, GPIO_PIN_RESET)
//TCS34725 I2C初始化
void TCS34725_I2C_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOI_CLK_ENABLE(); //使能GPIOI时钟
GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull = GPIO_PULLUP; //上拉
GPIO_Initure.Speed = GPIO_SPEED_FAST; //快速
GPIO_Initure.Pin = TCS_SDA_PIN;
HAL_GPIO_Init(TCS_SDA_GPIO, &GPIO_Initure);
GPIO_Initure.Pin = TCS_SCL_PIN;
HAL_GPIO_Init(TCS_SCL_GPIO, &GPIO_Initure);
TCS_SDA_SET;
TCS_SCL_SET;
delay_ms(10);
}
//产生I2C起始信号
void TCS34725_I2C_Start()
{
TCS_SDA_DIR_OUT();//sda线输出
TCS_SDA_SET;
TCS_SCL_SET;
delay_us(4);
TCS_SDA_RESET;//START:when CLK is high,DATA change form high to low
delay_us(4);
TCS_SCL_RESET;//钳住I2C总线,准备发送或接收数据
}
//产生I2C停止信号
void TCS34725_I2C_Stop()
{
TCS_SDA_DIR_OUT();//sda线输出
TCS_SCL_RESET;
TCS_SDA_RESET;//STOP:when CLK is high DATA change form low to high
delay_us(4);
TCS_SCL_SET;
TCS_SDA_SET;//发送I2C总线结束信号
delay_us(4);
}
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
uint8_t TCS34725_I2C_Wait_ACK()
{
uint8_t timeOut = 0;
TCS_SDA_DIR_IN();//SDA设置为输入
TCS_SDA_SET; delay_us(1);
TCS_SCL_SET; delay_us(1);
while(TCS_SDA_READ)
{
timeOut++;
if(timeOut > 250)
{
TCS34725_I2C_Stop();
return 1;
}
}
TCS_SCL_RESET;//时钟输出0
return 0;
}
//产生ACK应答
void TCS34725_I2C_ACK()
{
TCS_SCL_RESET;
TCS_SDA_DIR_OUT();//sda线输出
TCS_SDA_RESET;
delay_us(2);
TCS_SCL_SET;
delay_us(2);
TCS_SCL_RESET;
}
//不产生ACK应答
void TCS34725_I2C_NACK()
{
TCS_SCL_RESET;
TCS_SDA_DIR_OUT();//sda线输出
TCS_SDA_SET;
delay_us(2);
TCS_SCL_SET;
delay_us(2);
TCS_SCL_RESET;
}
//I2C发送一个字节
void TCS34725_I2C_Send_Byte(uint8_t byte)
{
uint8_t i = 0;
TCS_SDA_DIR_OUT();//sda线输出
TCS_SCL_RESET;//拉低时钟开始数据传输
for(i = 0; i < 8; i++)
{
((byte & 0x80) >> 7) == 0x01 ? TCS_SDA_SET : TCS_SDA_RESET;
byte <<= 1;
delay_us(2);
TCS_SCL_SET;
delay_us(2);
TCS_SCL_RESET;
delay_us(2);
}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
uint8_t TCS34725_I2C_Read_Byte(uint8_t ack)
{
uint8_t i,receive = 0;
TCS_SDA_DIR_IN();
for(i = 0; i < 8; i++)
{
TCS_SCL_RESET;
delay_us(2);
TCS_SCL_SET;
receive <<= 1;
if(TCS_SDA_READ) receive++;
delay_us(1);
}
if (!ack) TCS34725_I2C_NACK();//发送nACK
else TCS34725_I2C_ACK(); //发送ACK
return receive;
}
|