- 然后把之前写的 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;
- }
|