/* ****************************************************************************** * @file driver_ST7735S.c * @author �Ϻ����� * @version V1.0.0 * @date 2023 * @brief ST7735S driver. * This file provides firmware functions to manage gc9c01 * with SPI and DMA. User should set GPIO, dma channel, spi * channel according actual resource allocation. ****************************************************************************** * @attention * * Copyright (c) 2023 Bixdo. * All rights reserved. ****************************************************************************** */ #include "ALLinclude.h" #include "vl53l0x_i2c.h" #include "FunctionPressure.h" #include "PMDS_Fx.h" #include "IIC.h" static void delay_us(uint32_t delay_data) { uint8_t delay_data_; delay_data_= delay_data; while(delay_data_) { delay_data_--; } } void VL53L0X_i2c_init(void) { VL_SDA_OUT(); VL_IIC_SCL(); // GPIO_SetBits(GPIOD, GPIO_Pin_1|GPIO_Pin_2);//PD1,PD2 OUT HIGHT HAL_GPIO_WritePin(P_PORT_SDA,P_PIN_SDA, GPIO_PIN_SET); HAL_GPIO_WritePin(P_PORT_SCL,P_PIN_SCL, GPIO_PIN_SET); } void VL_SDA_IN(void) //PD1 SDA { #if MCU_STM32G030 ==1 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = P_PIN_SDA; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(P_PORT_SDA, &GPIO_InitStruct); #endif #if MCU_PY32F002A ==1 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = P_PIN_SDA; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(P_PORT_SDA, &GPIO_InitStruct); #endif #if MCU_STM32G431 ==1 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = P_PIN_SDA; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(P_PORT_SDA, &GPIO_InitStruct); #endif } void VL_SDA_OUT(void) //PD1 SDA { #if MCU_STM32G030 ==1 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = P_PIN_SDA; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(P_PORT_SDA, &GPIO_InitStruct); #endif #if MCU_PY32F002A ==1 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = P_PIN_SDA; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(P_PORT_SDA, &GPIO_InitStruct); #endif #if MCU_STM32G431 ==1 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = P_PIN_SDA; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(P_PORT_SDA, &GPIO_InitStruct); #endif } void VL_IIC_SCL(void) //PD2 SCL { #if MCU_STM32G030 ==1 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = P_PIN_SCL; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(P_PORT_SCL, &GPIO_InitStruct); #endif #if MCU_PY32F002A ==1 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = P_PIN_SCL; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(P_PORT_SCL, &GPIO_InitStruct); #endif #if MCU_STM32G431 ==1 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = P_PIN_SCL; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(P_PORT_SCL, &GPIO_InitStruct); #endif } void VL_IIC_SCL_IN(void) { #if MCU_STM32G030 ==1 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = P_PIN_SCL; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(P_PORT_SCL, &GPIO_InitStruct); #endif #if MCU_PY32F002A ==1 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = P_PIN_SCL; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(P_PORT_SCL, &GPIO_InitStruct); #endif #if MCU_STM32G431 ==1 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = P_PIN_SCL; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(P_PORT_SCL, &GPIO_InitStruct); #endif } //����IIC��ʼ�ź� void VL_IIC_Start(void) { VL_SDA_OUT();//sda����� #if MCU_STM32G030 ==1 || MCU_PY32F002A ==1 || MCU_STM32G431 ==1 HAL_GPIO_WritePin(P_PORT_SDA,P_PIN_SDA, GPIO_PIN_SET); HAL_GPIO_WritePin(P_PORT_SCL,P_PIN_SCL, GPIO_PIN_SET); // GPIO_WriteBit(GPIOD,GPIO_Pin_1,1);//VL_IIC_SDA=1; // GPIO_WriteBit(GPIOD,GPIO_Pin_2,1);//VL_IIC_SCL=1; delay_us(140); HAL_GPIO_WritePin(P_PORT_SDA,P_PIN_SDA, GPIO_PIN_RESET); // GPIO_WriteBit(GPIOD,GPIO_Pin_1,0);//VL_IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(140); HAL_GPIO_WritePin(P_PORT_SCL,P_PIN_SCL, GPIO_PIN_RESET); // GPIO_WriteBit(GPIOD,GPIO_Pin_2,0);//VL_IIC_SCL=0;//ǯסI2C���ߣ�׼�����ͻ�������� #endif } //����IICֹͣ�ź� void VL_IIC_Stop(void) { VL_SDA_OUT();//sda����� #if MCU_STM32G030 ==1 || MCU_PY32F002A ==1 || MCU_STM32G431 ==1 HAL_GPIO_WritePin(P_PORT_SDA,P_PIN_SDA, GPIO_PIN_RESET); HAL_GPIO_WritePin(P_PORT_SCL,P_PIN_SCL, GPIO_PIN_RESET); // GPIO_WriteBit(GPIOD,GPIO_Pin_2,0);//VL_IIC_SCL=0; // GPIO_WriteBit(GPIOD,GPIO_Pin_1,0);//VL_IIC_SDA=0;//STOP:when CLK is high DATA change form low to high delay_us(140); HAL_GPIO_WritePin(P_PORT_SCL,P_PIN_SCL, GPIO_PIN_SET); delay_us(140); HAL_GPIO_WritePin(P_PORT_SDA,P_PIN_SDA, GPIO_PIN_SET); // GPIO_WriteBit(GPIOD,GPIO_Pin_2,1);//VL_IIC_SCL=1; // GPIO_WriteBit(GPIOD,GPIO_Pin_1,1);//VL_IIC_SDA=1;//����I2C���߽����ź� delay_us(140); #endif } //�ȴ�Ӧ���źŵ��� //����ֵ��1������Ӧ��ʧ�� // 0������Ӧ��ɹ� u8 VL_IIC_Wait_Ack(void) { u8 ucErrTime=0; VL_SDA_IN(); //SDA����Ϊ���� #if MCU_STM32G030 ==1 || MCU_PY32F002A ==1 || MCU_STM32G431 ==1 HAL_GPIO_WritePin(GPIO_SDA,GPIO_PIN_SDA, GPIO_PIN_SET); // GPIO_WriteBit(GPIOD,GPIO_Pin_1,1);//VL_IIC_SDA=1;// delay_us(120); HAL_GPIO_WritePin(GPIO_CLK,GPIO_PIN_CLK, GPIO_PIN_SET); // GPIO_WriteBit(GPIOD,GPIO_Pin_2,1);//VL_IIC_SCL=1; delay_us(120); // while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1)) while(HAL_GPIO_ReadPin(GPIO_SDA,GPIO_PIN_SDA)) { ucErrTime++; if(ucErrTime>250) { VL_IIC_Stop(); return 1; } } HAL_GPIO_WritePin(GPIO_CLK,GPIO_PIN_CLK, GPIO_PIN_RESET); // GPIO_WriteBit(GPIOD,GPIO_Pin_2,0);//VL_IIC_SCL=0;//ʱ�����0 #endif return 0; } //����ACKӦ�� void VL_IIC_Ack(void) { #if MCU_STM32G030 ==1 || MCU_PY32F002A ==1 || MCU_STM32G431 ==1 HAL_GPIO_WritePin(GPIO_CLK,GPIO_PIN_CLK, GPIO_PIN_RESET); // GPIO_WriteBit(GPIOD,GPIO_Pin_2,0);//VL_IIC_SCL=0; VL_SDA_OUT(); HAL_GPIO_WritePin(GPIO_SDA,GPIO_PIN_SDA, GPIO_PIN_RESET); // GPIO_WriteBit(GPIOD,GPIO_Pin_1,0);//VL_IIC_SDA=0; delay_us(120); HAL_GPIO_WritePin(GPIO_CLK,GPIO_PIN_CLK, GPIO_PIN_SET); // GPIO_WriteBit(GPIOD,GPIO_Pin_2,1);//VL_IIC_SCL=1; delay_us(120); HAL_GPIO_WritePin(GPIO_CLK,GPIO_PIN_CLK, GPIO_PIN_RESET); // GPIO_WriteBit(GPIOD,GPIO_Pin_2,0);//VL_IIC_SCL=0; #endif #if MCU_STM32G431 ==1 #endif } //������ACKӦ�� void VL_IIC_NAck(void) { #if MCU_STM32G030 ==1 || MCU_PY32F002A ==1 || MCU_STM32G431 ==1 HAL_GPIO_WritePin(GPIO_CLK,GPIO_PIN_CLK, GPIO_PIN_RESET); // GPIO_WriteBit(GPIOD,GPIO_Pin_2,0);//VL_IIC_SCL=0; VL_SDA_OUT(); HAL_GPIO_WritePin(GPIO_SDA,GPIO_PIN_SDA, GPIO_PIN_SET); // GPIO_WriteBit(GPIOD,GPIO_Pin_1,1);//VL_IIC_SDA=1; delay_us(120); HAL_GPIO_WritePin(GPIO_CLK,GPIO_PIN_CLK, GPIO_PIN_SET); // GPIO_WriteBit(GPIOD,GPIO_Pin_2,1);//VL_IIC_SCL=1; delay_us(120); HAL_GPIO_WritePin(GPIO_CLK,GPIO_PIN_CLK, GPIO_PIN_RESET); // GPIO_WriteBit(GPIOD,GPIO_Pin_2,0);//VL_IIC_SCL=0; #endif } //IIC����һ���ֽ� //���شӻ�����Ӧ�� //1����Ӧ�� //0����Ӧ�� void VL_IIC_Send_Byte(uint8_t txd) { uint8_t t; VL_SDA_OUT(); #if MCU_STM32G030 ==1 || MCU_PY32F002A ==1 || MCU_STM32G431 ==1 HAL_GPIO_WritePin(GPIO_CLK,GPIO_PIN_CLK, GPIO_PIN_RESET); // GPIO_WriteBit(GPIOD,GPIO_Pin_2,0);//VL_IIC_SCL=0;//����ʱ�ӿ�ʼ���ݴ��� for(t=0;t<8;t++) { if((txd&0x80)>>7) HAL_GPIO_WritePin(GPIO_SDA,GPIO_PIN_SDA, GPIO_PIN_SET); // GPIO_WriteBit(GPIOD,GPIO_Pin_1,1);// VL_IIC_SDA=1; else HAL_GPIO_WritePin(GPIO_SDA,GPIO_PIN_SDA, GPIO_PIN_RESET); // GPIO_WriteBit(GPIOD,GPIO_Pin_1,0);// VL_IIC_SDA=0; txd<<=1; delay_us(120); HAL_GPIO_WritePin(GPIO_CLK,GPIO_PIN_CLK, GPIO_PIN_SET); // GPIO_WriteBit(GPIOD,GPIO_Pin_2,1);//VL_IIC_SCL=1; delay_us(120); HAL_GPIO_WritePin(GPIO_CLK,GPIO_PIN_CLK, GPIO_PIN_RESET); // GPIO_WriteBit(GPIOD,GPIO_Pin_2,0);//VL_IIC_SCL=0; delay_us(120); } #endif } //��1���ֽڣ�ack=1ʱ������ACK��ack=0������nACK uint8_t VL_IIC_Read_Byte(unsigned char ack) { unsigned char i,receive=0; VL_SDA_IN();//SDA����Ϊ���� #if MCU_STM32G030 ==1 || MCU_PY32F002A ==1 || MCU_STM32G431 ==1 for(i=0;i<8;i++ ) { HAL_GPIO_WritePin(GPIO_CLK,GPIO_PIN_CLK, GPIO_PIN_RESET); // GPIO_WriteBit(GPIOD,GPIO_Pin_2,0);//VL_IIC_SCL=0; delay_us(140); HAL_GPIO_WritePin(GPIO_CLK,GPIO_PIN_CLK, GPIO_PIN_SET); // GPIO_WriteBit(GPIOD,GPIO_Pin_2,1);//VL_IIC_SCL=1; receive<<=1; if(HAL_GPIO_ReadPin(GPIO_SDA,GPIO_PIN_SDA))receive++; // if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1))receive++; delay_us(140); //1 } if (!ack) VL_IIC_NAck();//����nACK else VL_IIC_Ack(); //����ACK #endif return receive; } //IICдһ���ֽ����� uint8_t VL_IIC_Write_1Byte(uint8_t SlaveAddress, uint8_t REG_Address,uint8_t REG_data) { VL_IIC_Start(); VL_IIC_Send_Byte(SlaveAddress); if(VL_IIC_Wait_Ack()) { VL_IIC_Stop();//�ͷ����� return 1;//ûӦ�����˳� } VL_IIC_Send_Byte(REG_Address); VL_IIC_Wait_Ack(); VL_IIC_Send_Byte(REG_data); VL_IIC_Wait_Ack(); VL_IIC_Stop(); return 0; } //IIC��һ���ֽ����� uint8_t VL_IIC_Read_1Byte(uint8_t SlaveAddress, uint8_t REG_Address,uint8_t *REG_data) { VL_IIC_Start(); VL_IIC_Send_Byte(SlaveAddress);//��д���� if(VL_IIC_Wait_Ack()) { VL_IIC_Stop();//�ͷ����� return 1;//ûӦ�����˳� } VL_IIC_Send_Byte(REG_Address); VL_IIC_Wait_Ack(); VL_IIC_Start(); VL_IIC_Send_Byte(SlaveAddress|0x01);//�������� VL_IIC_Wait_Ack(); *REG_data = VL_IIC_Read_Byte(0); VL_IIC_Stop(); return 0; } //IICдn�ֽ����� uint8_t VL_IIC_Write_nByte(uint8_t SlaveAddress, uint8_t REG_Address,u16 len, uint8_t *buf) { //#ifdef iic_soft VL_IIC_Start(); VL_IIC_Send_Byte(SlaveAddress);//��д���� if(VL_IIC_Wait_Ack()) { VL_IIC_Stop();//�ͷ����� return 1;//ûӦ�����˳� } VL_IIC_Send_Byte(REG_Address); VL_IIC_Wait_Ack(); while(len--) { VL_IIC_Send_Byte(*buf++);//����buff������ VL_IIC_Wait_Ack(); } VL_IIC_Stop();//�ͷ����� return 0; //#endif #ifdef iic_hard_ware HAL_StatusTypeDef ret = HAL_ERROR; ret=I2C_Write(SlaveAddress,REG_Address,buf,len); return ret; #endif } //IIC��n�ֽ����� uint8_t VL_IIC_Read_nByte(uint8_t SlaveAddress, uint8_t REG_Address,uint8_t len,uint8_t *buf) { uint8_t SlaveAddress_; #if IICAddress_7BIT ==1 SlaveAddress_=SlaveAddress<<1; #endif #if IICAddress_8BIT ==1 SlaveAddress_=SlaveAddress; #endif //#ifdef iic_soft VL_IIC_Start(); VL_IIC_Send_Byte(SlaveAddress_);//��д���� if(VL_IIC_Wait_Ack()) { VL_IIC_Stop();//�ͷ����� return 1;//ûӦ�����˳� } VL_IIC_Send_Byte(REG_Address); VL_IIC_Wait_Ack(); VL_IIC_Start(); VL_IIC_Send_Byte(SlaveAddress_|0x01);//�������� VL_IIC_Wait_Ack(); while(len) { if(len==1) { *buf = VL_IIC_Read_Byte(0); } else { *buf = VL_IIC_Read_Byte(1); } buf++; len--; } VL_IIC_Stop();//�ͷ����� return 0; //#endif #ifdef iic_hard_ware HAL_StatusTypeDef ret = HAL_ERROR; ret=I2C_Read(SlaveAddress,®_Address,1,buf,(uint8_t)(len)); return ret; #endif } //VL53L0X д������� //address:��ַ //index:ƫ�Ƶ�ַ //pdata:����ָ�� //count:���� ���65535 uint8_t VL53L0X_write_multi(uint8_t address, uint8_t index,uint8_t *pdata,uint16_t count) { uint8_t status = STATUS_OK; if(VL_IIC_Write_nByte(address,index,count,pdata)) { status = STATUS_FAIL; } return status; } //VL53L0X ��������� //address:��ַ //index:ƫ�Ƶ�ַ //pdata:����ָ�� //count:���� ���65535 uint8_t VL53L0X_read_multi(uint8_t address,uint8_t index,uint8_t *pdata,uint16_t count) { uint8_t status = STATUS_OK; if(VL_IIC_Read_nByte(address,index,count,pdata)) { status = STATUS_FAIL; } return status; } //VL53L0X д1������(���ֽ�) //address:��ַ //index:ƫ�Ƶ�ַ //data:����(8λ) uint8_t VL53L0X_write_byte(uint8_t address,uint8_t index,uint8_t data) { uint8_t status = STATUS_OK; status = VL53L0X_write_multi(address,index,&data,1); return status; } //VL53L0X д1������(˫�ֽ�) //address:��ַ //index:ƫ�Ƶ�ַ //data:����(16λ) uint8_t VL53L0X_write_word(uint8_t address,uint8_t index,uint16_t data) { uint8_t status = STATUS_OK; uint8_t buffer[2]; //��16λ���ݲ�ֳ�8λ buffer[0] = (uint8_t)(data>>8);//�߰�λ buffer[1] = (uint8_t)(data&0xff);//�Ͱ�λ if(index%2==1) { //����ͨ�Ų��ܴ����Է�2�ֽڶ���Ĵ������ֽ� status = VL53L0X_write_multi(address,index,&buffer[0],1); status = VL53L0X_write_multi(address,index,&buffer[0],1); }else { status = VL53L0X_write_multi(address,index,buffer,2); } return status; } //VL53L0X д1������(���ֽ�) //address:��ַ //index:ƫ�Ƶ�ַ //data:����(32λ) uint8_t VL53L0X_write_dword(uint8_t address,uint8_t index,uint32_t data) { uint8_t status = STATUS_OK; uint8_t buffer[4]; //��32λ���ݲ�ֳ�8λ buffer[0] = (uint8_t)(data>>24); buffer[1] = (uint8_t)((data&0xff0000)>>16); buffer[2] = (uint8_t)((data&0xff00)>>8); buffer[3] = (uint8_t)(data&0xff); status = VL53L0X_write_multi(address,index,buffer,4); return status; } //VL53L0X ��1������(���ֽ�) //address:��ַ //index:ƫ�Ƶ�ַ //data:����(8λ) uint8_t VL53L0X_read_byte(uint8_t address,uint8_t index,uint8_t *pdata) { uint8_t status = STATUS_OK; status = VL53L0X_read_multi(address,index,pdata,1); return status; } //VL53L0X ��������(˫�ֽ�) //address:��ַ //index:ƫ�Ƶ�ַ //data:����(16λ) uint8_t VL53L0X_read_word(uint8_t address,uint8_t index,uint16_t *pdata) { uint8_t status = STATUS_OK; uint8_t buffer[2]; status = VL53L0X_read_multi(address,index,buffer,2); *pdata = ((u16)buffer[0]<<8)+(u16)buffer[1]; return status; } //VL53L0X ��1������(���ֽ�) //address:��ַ //index:ƫ�Ƶ�ַ //data:����(32λ) uint8_t VL53L0X_read_dword(uint8_t address,uint8_t index,uint32_t *pdata) { uint8_t status = STATUS_OK; uint8_t buffer[4]; status = VL53L0X_read_multi(address,index,buffer,4); *pdata = ((u32)buffer[0]<<24)+((u32)buffer[1]<<16)+((u32)buffer[2]<<8)+((u32)buffer[3]); return status; } /*********************************************END OF FILE*********************************************/