NV14 touch driver
This commit is contained in:
committed by
Raphael Coeffic
parent
f8d1e4143b
commit
244efed6ba
@@ -23,6 +23,7 @@
|
||||
#include "stm32_pulse_driver.h"
|
||||
|
||||
#include "hal.h"
|
||||
#include "board.h"
|
||||
#include "timers_driver.h"
|
||||
|
||||
static const stm32_pulse_timer_t extmoduleTimer = {
|
||||
|
||||
@@ -19,10 +19,14 @@
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include "gyro.h"
|
||||
|
||||
#if defined(IMU_I2C_BUS) && defined(IMU_I2C_ADDRESS)
|
||||
|
||||
#include "stm32_i2c_driver.h"
|
||||
#include "delays_driver.h"
|
||||
#include "hal.h"
|
||||
#include "gyro.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
@@ -266,3 +270,10 @@ int gyroRead(uint8_t buffer[IMU_BUFFER_LENGTH])
|
||||
{
|
||||
return I2C_LSM6DS_ReadRegister(LSM6DS_GYRO_OUT_X_L_ADDR, buffer, IMU_BUFFER_LENGTH);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int gyroInit() { return -1; }
|
||||
int gyroRead(uint8_t buffer[IMU_BUFFER_LENGTH]) { return -1; }
|
||||
|
||||
#endif
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "stm32_i2c_driver.h"
|
||||
#include "hal.h"
|
||||
|
||||
#include "timers_driver.h"
|
||||
#include "debug.h"
|
||||
|
||||
struct _i2c_defs {
|
||||
|
||||
@@ -28,7 +28,7 @@ uint16_t getTmr2MHz();
|
||||
#define watchdogSuspend(timeout)
|
||||
#else
|
||||
|
||||
#include "board.h"
|
||||
#include "hal.h"
|
||||
|
||||
void init2MhzTimer();
|
||||
void init1msTimer();
|
||||
|
||||
@@ -62,11 +62,6 @@ extern HardwareOptions hardwareOptions;
|
||||
#define LUA_MEM_EXTRA_MAX (2 MB) // max allowed memory usage for Lua bitmaps (in bytes)
|
||||
#define LUA_MEM_MAX (6 MB) // max allowed memory usage for complete Lua (in bytes), 0 means unlimited
|
||||
|
||||
// HSI is at 168Mhz (over-drive is not enabled!)
|
||||
#define PERI1_FREQUENCY 42000000
|
||||
#define PERI2_FREQUENCY 84000000
|
||||
#define TIMER_MULT_APB1 2
|
||||
#define TIMER_MULT_APB2 2
|
||||
|
||||
extern uint16_t sessionTimer;
|
||||
|
||||
|
||||
@@ -23,6 +23,10 @@
|
||||
#define _HAL_H_
|
||||
|
||||
#define CPU_FREQ 168000000
|
||||
#define PERI1_FREQUENCY 42000000
|
||||
#define PERI2_FREQUENCY 84000000
|
||||
#define TIMER_MULT_APB1 2
|
||||
#define TIMER_MULT_APB2 2
|
||||
|
||||
// Keys
|
||||
#define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOH | RCC_AHB1Periph_GPIOI | RCC_AHB1Periph_GPIOJ)
|
||||
@@ -847,12 +851,8 @@
|
||||
#define EXTMODULE_RCC_APB2Periph 0
|
||||
#define EXTMODULE_TX_GPIO GPIOB
|
||||
#define EXTMODULE_USART_GPIO EXTMODULE_TX_GPIO
|
||||
#define EXTMODULE_TX_GPIO_PIN GPIO_Pin_10 // PB.10 (TIM2_CH3)
|
||||
#define EXTMODULE_TX_GPIO_PIN_LL LL_GPIO_PIN_10 // PB.10 (TIM2_CH3)
|
||||
#define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource10
|
||||
#define EXTMODULE_RX_GPIO_PIN GPIO_Pin_11 // PB.11
|
||||
#define EXTMODULE_RX_GPIO_PIN_LL LL_GPIO_PIN_11 // PB.11
|
||||
#define EXTMODULE_RX_GPIO_PinSource GPIO_PinSource11
|
||||
#define EXTMODULE_TX_GPIO_PIN LL_GPIO_PIN_10 // PB.10 (TIM2_CH3)
|
||||
#define EXTMODULE_RX_GPIO_PIN LL_GPIO_PIN_11 // PB.11
|
||||
#define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM2
|
||||
#define EXTMODULE_TIMER TIM2
|
||||
#define EXTMODULE_TIMER_Channel LL_TIM_CHANNEL_CH3
|
||||
@@ -861,7 +861,7 @@
|
||||
#define EXTMODULE_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
|
||||
#define EXTMODULE_TIMER_IRQn TIM2_IRQn
|
||||
#define EXTMODULE_TIMER_IRQHandler TIM2_IRQHandler
|
||||
#define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_3
|
||||
#define EXTMODULE_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_3
|
||||
#define EXTMODULE_TIMER_DMA_STREAM DMA1_Stream1
|
||||
#define EXTMODULE_TIMER_DMA DMA1
|
||||
#define EXTMODULE_TIMER_DMA_STREAM_LL LL_DMA_STREAM_1
|
||||
@@ -874,11 +874,11 @@
|
||||
#define EXTMODULE_USART_IRQn USART3_IRQn
|
||||
#define EXTMODULE_USART_IRQHandler USART3_IRQHandler
|
||||
#define EXTMODULE_USART_TX_DMA DMA1
|
||||
#define EXTMODULE_USART_TX_DMA_CHANNEL DMA_Channel_4
|
||||
#define EXTMODULE_USART_TX_DMA_CHANNEL LL_DMA_CHANNEL_4
|
||||
#define EXTMODULE_USART_TX_DMA_STREAM DMA1_Stream3
|
||||
#define EXTMODULE_USART_TX_DMA_STREAM_LL LL_DMA_STREAM_3
|
||||
#define EXTMODULE_USART_TX_DMA_FLAG_TC DMA_FLAG_TCIF3
|
||||
#define EXTMODULE_USART_RX_DMA_CHANNEL DMA_Channel_4
|
||||
#define EXTMODULE_USART_RX_DMA_CHANNEL LL_DMA_CHANNEL_4
|
||||
#define EXTMODULE_USART_RX_DMA_STREAM DMA1_Stream1
|
||||
#elif defined(PCBX10) || PCBREV >= 13
|
||||
#define EXTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA2)
|
||||
@@ -894,7 +894,7 @@
|
||||
#define EXTMODULE_TIMER_IRQn TIM1_UP_TIM10_IRQn
|
||||
#define EXTMODULE_TIMER_IRQHandler TIM1_UP_TIM10_IRQHandler
|
||||
#define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
|
||||
#define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_6
|
||||
#define EXTMODULE_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_6
|
||||
#define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream5
|
||||
#define EXTMODULE_TIMER_DMA DMA2
|
||||
#define EXTMODULE_TIMER_DMA_STREAM_LL LL_DMA_STREAM_5
|
||||
@@ -916,7 +916,7 @@
|
||||
#define EXTMODULE_TIMER_IRQn TIM2_IRQn
|
||||
#define EXTMODULE_TIMER_IRQHandler TIM2_IRQHandler
|
||||
#define EXTMODULE_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1)
|
||||
#define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_3
|
||||
#define EXTMODULE_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_3
|
||||
#define EXTMODULE_TIMER_DMA_STREAM DMA1_Stream7
|
||||
#define EXTMODULE_TIMER_DMA DMA1
|
||||
#define EXTMODULE_TIMER_DMA_STREAM_LL LL_DMA_STREAM_7
|
||||
|
||||
@@ -48,12 +48,6 @@
|
||||
#define LUA_MEM_EXTRA_MAX (2 MB) // max allowed memory usage for Lua bitmaps (in bytes)
|
||||
#define LUA_MEM_MAX (6 MB) // max allowed memory usage for complete Lua (in bytes), 0 means unlimited
|
||||
|
||||
// HSI is at 168Mhz (over-drive is not enabled!)
|
||||
#define PERI1_FREQUENCY 42000000
|
||||
#define PERI2_FREQUENCY 84000000
|
||||
#define TIMER_MULT_APB1 2
|
||||
#define TIMER_MULT_APB2 2
|
||||
|
||||
extern uint16_t sessionTimer;
|
||||
|
||||
#define SLAVE_MODE() (g_model.trainerData.mode == TRAINER_MODE_SLAVE)
|
||||
|
||||
@@ -24,6 +24,12 @@
|
||||
|
||||
#define CPU_FREQ 168000000
|
||||
|
||||
// HSI is at 168Mhz (over-drive is not enabled!)
|
||||
#define PERI1_FREQUENCY 42000000
|
||||
#define PERI2_FREQUENCY 84000000
|
||||
#define TIMER_MULT_APB1 2
|
||||
#define TIMER_MULT_APB2 2
|
||||
|
||||
/* Timers Allocation:
|
||||
* TIM1 = Haptic
|
||||
* TIM4 = Trainer
|
||||
@@ -334,8 +340,26 @@
|
||||
#define AUDIO_SPI_MOSI_GPIO_PinSource GPIO_PinSource5
|
||||
|
||||
// I2C Bus
|
||||
#define I2C_B1_RCC_AHB1Periph 0
|
||||
#define I2C_B1_RCC_APB1Periph 0
|
||||
#define I2C_B1 I2C1
|
||||
#define I2C_B1_GPIO GPIOB
|
||||
#define I2C_B1_SCL_GPIO_PIN LL_GPIO_PIN_8 // PB.08
|
||||
#define I2C_B1_SDA_GPIO_PIN LL_GPIO_PIN_7 // PB.09
|
||||
#define I2C_B1_GPIO_AF GPIO_AF4_I2C1
|
||||
|
||||
#define TOUCH_I2C_BUS I2C_Bus_1
|
||||
#define TOUCH_I2C_CLK_RATE 400000
|
||||
|
||||
#define TOUCH_INT_GPIO GPIOB
|
||||
#define TOUCH_INT_GPIO_PIN LL_GPIO_PIN_9 // PB.09
|
||||
|
||||
#define TOUCH_RST_GPIO GPIOB
|
||||
#define TOUCH_RST_GPIO_PIN LL_GPIO_PIN_12 // PB.12
|
||||
|
||||
#define TOUCH_INT_EXTI_Line LL_EXTI_LINE_9
|
||||
#define TOUCH_INT_EXTI_Port LL_SYSCFG_EXTI_PORTB
|
||||
#define TOUCH_INT_EXTI_SysCfgLine LL_SYSCFG_EXTI_LINE9
|
||||
#define TOUCH_INT_EXTI_IRQn EXTI9_5_IRQn
|
||||
#define TOUCH_INT_EXTI_IRQHandler EXTI9_5_IRQHandler
|
||||
|
||||
// Haptic: TIM1_CH1
|
||||
#define HAPTIC_PWM
|
||||
@@ -427,36 +451,32 @@
|
||||
#define EXTMODULE_RCC_APB1Periph 0
|
||||
#define EXTMODULE_RCC_APB2Periph (RCC_APB2Periph_TIM8 | RCC_APB2Periph_USART6)
|
||||
#define EXTMODULE_TX_GPIO GPIOC
|
||||
#define EXTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PC.06
|
||||
#define EXTMODULE_TX_GPIO_PIN_LL LL_GPIO_PIN_6
|
||||
#define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource6
|
||||
#define EXTMODULE_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH1
|
||||
#define EXTMODULE_TX_GPIO_PIN LL_GPIO_PIN_6 // PC.06
|
||||
#define EXTMODULE_TX_GPIO_AF LL_GPIO_AF_3 // TIM8_CH1
|
||||
#define EXTMODULE_TX_GPIO_AF_USART GPIO_AF_USART6
|
||||
#define EXTMODULE_RX_GPIO GPIOC
|
||||
#define EXTMODULE_RX_GPIO_PIN GPIO_Pin_7 // PC.07
|
||||
#define EXTMODULE_RX_GPIO_PIN_LL LL_GPIO_PIN_7
|
||||
#define EXTMODULE_RX_GPIO_PinSource GPIO_PinSource7
|
||||
#define EXTMODULE_RX_GPIO_PIN LL_GPIO_PIN_7 // PC.07
|
||||
#define EXTMODULE_RX_GPIO_AF_USART GPIO_AF_USART6
|
||||
#define EXTMODULE_TIMER TIM8
|
||||
#define EXTMODULE_TIMER_Channel LL_TIM_CHANNEL_CH1
|
||||
#define EXTMODULE_TIMER_IRQn TIM8_UP_TIM13_IRQn
|
||||
#define EXTMODULE_TIMER_IRQHandler TIM8_UP_TIM13_IRQHandler
|
||||
#define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
|
||||
#define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8
|
||||
#define EXTMODULE_TIMER_TX_GPIO_AF LL_GPIO_AF_3
|
||||
//USART
|
||||
#define EXTMODULE_USART USART6
|
||||
#define EXTMODULE_USART_GPIO GPIOC
|
||||
#define EXTMODULE_USART_GPIO_AF GPIO_AF_USART6
|
||||
#define EXTMODULE_USART_GPIO_AF_LL LL_GPIO_AF_8
|
||||
#define EXTMODULE_USART_TX_DMA DMA2
|
||||
#define EXTMODULE_USART_TX_DMA_CHANNEL DMA_Channel_5
|
||||
#define EXTMODULE_USART_TX_DMA_CHANNEL LL_DMA_CHANNEL_5
|
||||
#define EXTMODULE_USART_TX_DMA_STREAM DMA2_Stream7
|
||||
#define EXTMODULE_USART_TX_DMA_STREAM_LL LL_DMA_STREAM_7
|
||||
#define EXTMODULE_USART_TX_DMA_IRQn DMA2_Stream7_IRQn
|
||||
#define EXTMODULE_USART_TX_DMA_IRQHandler DMA2_Stream7_IRQHandler
|
||||
#define EXTMODULE_USART_TX_DMA_FLAG_TC DMA_IT_TCIF7
|
||||
|
||||
#define EXTMODULE_USART_RX_DMA_CHANNEL DMA_Channel_5
|
||||
#define EXTMODULE_USART_RX_DMA_CHANNEL LL_DMA_CHANNEL_5
|
||||
#define EXTMODULE_USART_RX_DMA_STREAM DMA2_Stream2
|
||||
#define EXTMODULE_USART_RX_DMA_IRQn DMA2_Stream2_IRQn
|
||||
#define EXTMODULE_USART_RX_DMA_IRQHandler DMA2_Stream2_IRQHandler
|
||||
@@ -467,7 +487,7 @@
|
||||
|
||||
#define EXTMODULE_TIMER_DMA_SIZE (DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0)
|
||||
//TIMER
|
||||
#define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7
|
||||
#define EXTMODULE_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_7
|
||||
#define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1
|
||||
#define EXTMODULE_TIMER_DMA DMA2
|
||||
#define EXTMODULE_TIMER_DMA_STREAM_LL LL_DMA_STREAM_1
|
||||
|
||||
@@ -19,26 +19,28 @@
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include "opentx.h"
|
||||
#include "stm32_hal_ll.h"
|
||||
#include "stm32_hal.h"
|
||||
#include "hal.h"
|
||||
|
||||
#include "stm32_i2c_driver.h"
|
||||
#include "timers_driver.h"
|
||||
#include "delays_driver.h"
|
||||
#include "touch_driver.h"
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
volatile static bool touchEventOccured;
|
||||
|
||||
#define FT6x06_MAX_INSTANCE 1
|
||||
|
||||
#define I2C_TOUCH_RCC_AHB1Periph RCC_AHB1Periph_GPIOB
|
||||
#define I2C_TOUCH_RCC_APB1Periph RCC_APB1Periph_I2C1
|
||||
#define I2C_TOUCH I2C1
|
||||
#define I2C_TOUCH_GPIO GPIOB
|
||||
#define I2C_TOUCH_SCL_GPIO_PIN GPIO_Pin_8 // PB.08
|
||||
#define I2C_TOUCH_SDA_GPIO_PIN GPIO_Pin_7 // PB.09
|
||||
#define TOUCH_RCC_AHB1Periph RCC_AHB1Periph_GPIOB
|
||||
#define TOUCH_RCC_APB1Periph RCC_APB1Periph_I2C1
|
||||
#define TOUCH_GPIO I2C_B1_GPIO
|
||||
#define TOUCH_SCL_GPIO_PIN I2C_B1_SCL_GPIO_PIN // PB.08
|
||||
#define TOUCH_SDA_GPIO_PIN I2C_B1_SDA_GPIO_PIN // PB.09
|
||||
|
||||
#define I2C_TOUCH_RESET_GPIO GPIOB
|
||||
#define I2C_TOUCH_RESET_GPIO_PIN GPIO_Pin_12 // PB.12
|
||||
#define I2C_TOUCH_INT_GPIO GPIOB
|
||||
#define I2C_TOUCH_INT_GPIO_PIN GPIO_Pin_9 // PB.09
|
||||
|
||||
#define TOUCH_FT6236_I2C_ADDRESS (0x70>>1)
|
||||
#define TOUCH_FT6236_I2C_ADDRESS (0x70>>1)
|
||||
|
||||
uint8_t ft6x06[FT6x06_MAX_INSTANCE] = {0};
|
||||
static ft6x06_handle_TypeDef ft6x06_handle = {FT6206_I2C_NOT_INITIALIZED, 0, 0};
|
||||
@@ -52,209 +54,142 @@ static TouchState internalTouchState = {};
|
||||
|
||||
void I2C_FreeBus()
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
// reset i2c bus by setting clk as output and sending manual clock pulses
|
||||
GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_SCL_GPIO_PIN;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
|
||||
GPIO_Init(I2C_TOUCH_GPIO, &GPIO_InitStructure);
|
||||
LL_GPIO_InitTypeDef gpioInit;
|
||||
LL_GPIO_StructInit(&gpioInit);
|
||||
|
||||
GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_SDA_GPIO_PIN;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
|
||||
GPIO_Init(I2C_TOUCH_GPIO, &GPIO_InitStructure);
|
||||
// reset i2c bus by setting clk as output and sending manual clock pulses
|
||||
gpioInit.Pin = TOUCH_SCL_GPIO_PIN;
|
||||
gpioInit.Mode = LL_GPIO_MODE_OUTPUT;
|
||||
gpioInit.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
|
||||
gpioInit.Pull = LL_GPIO_PULL_NO;
|
||||
gpioInit.Speed = LL_GPIO_SPEED_FREQ_LOW;
|
||||
LL_GPIO_Init(TOUCH_GPIO, &gpioInit);
|
||||
|
||||
gpioInit.Pin = TOUCH_SDA_GPIO_PIN;
|
||||
gpioInit.Mode = LL_GPIO_MODE_INPUT;
|
||||
gpioInit.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
|
||||
gpioInit.Pull = LL_GPIO_PULL_UP;
|
||||
gpioInit.Speed = LL_GPIO_SPEED_FREQ_LOW;
|
||||
LL_GPIO_Init(TOUCH_GPIO, &gpioInit);
|
||||
|
||||
//send 100khz clock train for some 100ms
|
||||
tmr10ms_t until = get_tmr10ms() + 11;
|
||||
while (get_tmr10ms() < until) {
|
||||
if (GPIO_ReadInputDataBit(I2C_TOUCH_GPIO, I2C_TOUCH_SDA_GPIO_PIN) == 1) {
|
||||
if (LL_GPIO_IsInputPinSet(TOUCH_GPIO, TOUCH_SDA_GPIO_PIN)) {
|
||||
TRACE("touch: i2c free again\n");
|
||||
break;
|
||||
}
|
||||
TRACE("FREEEEE");
|
||||
I2C_TOUCH_GPIO->BSRRH = I2C_TOUCH_SCL_GPIO_PIN; //BSRRL
|
||||
LL_GPIO_ResetOutputPin(TOUCH_GPIO, TOUCH_SCL_GPIO_PIN);
|
||||
delay_us(10);
|
||||
I2C_TOUCH_GPIO->BSRRL = I2C_TOUCH_SCL_GPIO_PIN;
|
||||
LL_GPIO_SetOutputPin(TOUCH_GPIO, TOUCH_SCL_GPIO_PIN);
|
||||
delay_us(10);
|
||||
}
|
||||
|
||||
//send stop condition:
|
||||
GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_SDA_GPIO_PIN;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
|
||||
GPIO_Init(I2C_TOUCH_GPIO, &GPIO_InitStructure);
|
||||
gpioInit.Pin = TOUCH_SDA_GPIO_PIN;
|
||||
gpioInit.Mode = LL_GPIO_MODE_OUTPUT;
|
||||
gpioInit.Speed = LL_GPIO_SPEED_FREQ_LOW;
|
||||
LL_GPIO_Init(TOUCH_GPIO, &gpioInit);
|
||||
|
||||
//clock is low
|
||||
I2C_TOUCH_GPIO->BSRRH = I2C_TOUCH_SCL_GPIO_PIN;
|
||||
LL_GPIO_ResetOutputPin(TOUCH_GPIO, TOUCH_SCL_GPIO_PIN);
|
||||
delay_us(10);
|
||||
//sda = lo
|
||||
I2C_TOUCH_GPIO->BSRRL = I2C_TOUCH_SDA_GPIO_PIN;
|
||||
LL_GPIO_SetOutputPin(TOUCH_GPIO, TOUCH_SDA_GPIO_PIN);
|
||||
delay_us(10);
|
||||
//clock goes high
|
||||
I2C_TOUCH_GPIO->BSRRH = I2C_TOUCH_SCL_GPIO_PIN;
|
||||
LL_GPIO_ResetOutputPin(TOUCH_GPIO, TOUCH_SCL_GPIO_PIN);
|
||||
delay_us(10);
|
||||
//sda = hi
|
||||
I2C_TOUCH_GPIO->BSRRL = I2C_TOUCH_SDA_GPIO_PIN;
|
||||
LL_GPIO_SetOutputPin(TOUCH_GPIO, TOUCH_SDA_GPIO_PIN);
|
||||
delay_us(10);
|
||||
TRACE("FREE BUS");
|
||||
}
|
||||
|
||||
void Touch_DeInit()
|
||||
// void Touch_DeInit()
|
||||
// {
|
||||
// I2C_DeInit(I2C_B1);
|
||||
// __HAL_RCC_I2C1_FORCE_RESET();
|
||||
// delay_ms(150);
|
||||
// __HAL_RCC_I2C1_RELEASE_RESET();
|
||||
// }
|
||||
|
||||
static int _enable_gpio_clock(GPIO_TypeDef *GPIOx)
|
||||
{
|
||||
I2C_DeInit(I2C_TOUCH);
|
||||
(RCC->APB1RSTR |= (RCC_APB1RSTR_I2C1RST));
|
||||
delay_ms(150);
|
||||
(RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C1RST));
|
||||
if (GPIOx == GPIOB)
|
||||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||
else
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void I2C_Init()
|
||||
{
|
||||
Touch_DeInit();
|
||||
stm32_i2c_deinit(TOUCH_I2C_BUS);
|
||||
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
EXTI_InitTypeDef EXTI_InitStructure;
|
||||
NVIC_InitTypeDef NVIC_InitStructure;
|
||||
I2C_InitTypeDef I2C_InitStructure;
|
||||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||
__HAL_RCC_SYSCFG_CLK_ENABLE();
|
||||
|
||||
|
||||
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
|
||||
|
||||
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
|
||||
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
|
||||
__HAL_RCC_I2C1_CLK_ENABLE();
|
||||
__HAL_RCC_I2C1_CLK_DISABLE();
|
||||
|
||||
I2C_FreeBus();
|
||||
|
||||
GPIO_PinAFConfig(I2C_TOUCH_GPIO, GPIO_PinSource7, GPIO_AF_I2C1);
|
||||
GPIO_PinAFConfig(I2C_TOUCH_GPIO, GPIO_PinSource8, GPIO_AF_I2C1);
|
||||
stm32_i2c_init(TOUCH_I2C_BUS, TOUCH_I2C_CLK_RATE);
|
||||
|
||||
LL_GPIO_InitTypeDef gpioInit;
|
||||
LL_GPIO_StructInit(&gpioInit);
|
||||
|
||||
GPIO_StructInit(&GPIO_InitStructure);
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||||
GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_SCL_GPIO_PIN | I2C_TOUCH_SDA_GPIO_PIN;
|
||||
GPIO_Init(I2C_TOUCH_GPIO, &GPIO_InitStructure);
|
||||
_enable_gpio_clock(TOUCH_RST_GPIO);
|
||||
_enable_gpio_clock(TOUCH_INT_GPIO);
|
||||
|
||||
GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_RESET_GPIO_PIN;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL; //
|
||||
GPIO_Init(I2C_TOUCH_RESET_GPIO, &GPIO_InitStructure);
|
||||
|
||||
|
||||
//https://community.st.com/s/question/0D50X00009XkZ9FSAV/stm32f4-i2c-issues-solved
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
|
||||
I2C_StructInit(&I2C_InitStructure);
|
||||
I2C_InitStructure.I2C_ClockSpeed = 400000;
|
||||
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
|
||||
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
|
||||
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
|
||||
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
|
||||
I2C_Init(I2C_TOUCH, &I2C_InitStructure);
|
||||
|
||||
I2C_Init(I2C_TOUCH, &I2C_InitStructure);
|
||||
//I2C_StretchClockCmd(I2C_TOUCH, ENABLE);
|
||||
I2C_Cmd(I2C_TOUCH, ENABLE);
|
||||
gpioInit.Pin = TOUCH_RST_GPIO_PIN;
|
||||
gpioInit.Mode = LL_GPIO_MODE_OUTPUT;
|
||||
gpioInit.Speed = LL_GPIO_SPEED_FREQ_LOW;
|
||||
gpioInit.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
|
||||
gpioInit.Pull = LL_GPIO_PULL_UP;
|
||||
LL_GPIO_Init(TOUCH_RST_GPIO, &gpioInit);
|
||||
|
||||
//ext interupt
|
||||
GPIO_InitStructure.GPIO_Pin = I2C_TOUCH_INT_GPIO_PIN;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_Init(I2C_TOUCH_INT_GPIO, &GPIO_InitStructure);
|
||||
gpioInit.Pin = TOUCH_INT_GPIO_PIN;
|
||||
gpioInit.Mode = LL_GPIO_MODE_INPUT;
|
||||
gpioInit.Pull = LL_GPIO_PULL_UP;
|
||||
gpioInit.Speed = LL_GPIO_SPEED_FREQ_HIGH;
|
||||
gpioInit.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
|
||||
LL_GPIO_Init(TOUCH_INT_GPIO, &gpioInit);
|
||||
|
||||
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource9);
|
||||
EXTI_InitStructure.EXTI_Line = EXTI_Line9;
|
||||
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
|
||||
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
|
||||
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
|
||||
EXTI_Init(&EXTI_InitStructure);
|
||||
LL_SYSCFG_SetEXTISource(TOUCH_INT_EXTI_Port, TOUCH_INT_EXTI_SysCfgLine);
|
||||
|
||||
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
|
||||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8;
|
||||
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
||||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||||
NVIC_Init(&NVIC_InitStructure);
|
||||
LL_EXTI_InitTypeDef extiInit;
|
||||
LL_EXTI_StructInit(&extiInit);
|
||||
|
||||
extiInit.Line_0_31 = TOUCH_INT_EXTI_Line;
|
||||
extiInit.Mode = LL_EXTI_MODE_IT;
|
||||
extiInit.Trigger = LL_EXTI_TRIGGER_FALLING;
|
||||
extiInit.LineCommand = ENABLE;
|
||||
LL_EXTI_Init(&extiInit);
|
||||
|
||||
NVIC_SetPriority(TOUCH_INT_EXTI_IRQn, 8);
|
||||
NVIC_EnableIRQ(TOUCH_INT_EXTI_IRQn);
|
||||
}
|
||||
|
||||
#define I2C_TIMEOUT_MAX 1000
|
||||
|
||||
bool I2C_WaitEvent(uint32_t event)
|
||||
{
|
||||
uint32_t timeout = I2C_TIMEOUT_MAX;
|
||||
while (!I2C_CheckEvent(I2C_TOUCH, event)) {
|
||||
if ((timeout--) == 0) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool I2C_WaitEventCleared(uint32_t event)
|
||||
{
|
||||
uint32_t timeout = I2C_TIMEOUT_MAX;
|
||||
while (I2C_CheckEvent(I2C_TOUCH, event)) {
|
||||
if ((timeout--) == 0) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool I2C_Send7BitAddress(uint8_t address, uint16_t direction)
|
||||
{
|
||||
I2C_SendData(I2C_TOUCH, (address << 1) | ((direction == I2C_Direction_Receiver) ? 1 : 0));
|
||||
// check if slave acknowledged his address within timeout
|
||||
if (!I2C_WaitEvent(direction == I2C_Direction_Transmitter ? I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED : I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
#define I2C_TIMEOUT_MAX 5 // 5 ms
|
||||
|
||||
bool touch_i2c_read(uint8_t addr, uint8_t reg, uint8_t * data, uint8_t len)
|
||||
{
|
||||
if (!I2C_WaitEventCleared(I2C_FLAG_BUSY)) return false;
|
||||
I2C_GenerateSTART(I2C_TOUCH, ENABLE);
|
||||
if (!I2C_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT)) return false;
|
||||
if (!I2C_Send7BitAddress(addr, I2C_Direction_Transmitter)) return false;
|
||||
I2C_SendData(I2C_TOUCH, reg);
|
||||
if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)) return false;
|
||||
I2C_GenerateSTART(I2C_TOUCH, ENABLE);
|
||||
if (!I2C_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT)) return false;
|
||||
if (!I2C_Send7BitAddress(addr, I2C_Direction_Receiver)) return false;
|
||||
if (stm32_i2c_read(TOUCH_I2C_BUS, addr, reg, 2, data, len, I2C_TIMEOUT_MAX) < 0)
|
||||
return false;
|
||||
|
||||
if (len > 1) I2C_AcknowledgeConfig(I2C_TOUCH, ENABLE);
|
||||
|
||||
while (len) {
|
||||
if (len == 1) I2C_AcknowledgeConfig(I2C_TOUCH, DISABLE);
|
||||
if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_RECEIVED))return false;
|
||||
*data++ = I2C_ReceiveData(I2C_TOUCH);;
|
||||
len--;
|
||||
}
|
||||
I2C_GenerateSTOP(I2C_TOUCH, ENABLE);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool touch_i2c_write(uint8_t addr, uint8_t reg, uint8_t * data, uint8_t len)
|
||||
{
|
||||
if (!I2C_WaitEventCleared(I2C_FLAG_BUSY)) return false;
|
||||
I2C_GenerateSTART(I2C_TOUCH, ENABLE);
|
||||
if (!I2C_WaitEvent(I2C_EVENT_MASTER_MODE_SELECT)) return false;
|
||||
if (stm32_i2c_write(TOUCH_I2C_BUS, addr, reg, 2, data, len, I2C_TIMEOUT_MAX) < 0)
|
||||
return false;
|
||||
|
||||
if (!I2C_Send7BitAddress(addr, I2C_Direction_Transmitter)) return false;
|
||||
I2C_SendData(I2C_TOUCH, (uint8_t) ((reg & 0xFF00) >> 8));
|
||||
if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING)) return false;
|
||||
I2C_SendData(I2C_TOUCH, (uint8_t) (reg & 0x00FF));
|
||||
if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING)) return false;
|
||||
while (len--) {
|
||||
I2C_SendData(I2C_TOUCH, *data);
|
||||
if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTING)) return false;
|
||||
data++;
|
||||
}
|
||||
if (!I2C_WaitEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED)) return false;
|
||||
I2C_GenerateSTOP(I2C_TOUCH, ENABLE);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -289,10 +224,12 @@ static uint16_t TS_IO_ReadMultiple(uint8_t addr, uint8_t reg, uint8_t * buffer,
|
||||
return 1;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static uint8_t TS_IO_Read(uint8_t reg)
|
||||
{
|
||||
return TS_IO_Read(TOUCH_FT6236_I2C_ADDRESS, reg);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void touch_ft6236_debug_info(void)
|
||||
{
|
||||
@@ -333,6 +270,7 @@ static uint8_t ft6x06_TS_DetectTouch(uint16_t DeviceAddr)
|
||||
return (nbTouch);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/**
|
||||
* @brief Get the touch detailed informations on touch number 'touchIdx' (0..1)
|
||||
* This touch detailed information contains :
|
||||
@@ -384,7 +322,7 @@ static void ft6x06_TS_GetTouchInfo(uint16_t DeviceAddr,
|
||||
|
||||
} /* of if(touchIdx < ft6x06_handle.currActiveTouchNb) */
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Get the touch screen X and Y positions values
|
||||
@@ -432,9 +370,9 @@ static void ft6x06_TS_GetXY(uint16_t DeviceAddr, uint16_t * X, uint16_t * Y, uin
|
||||
|
||||
void TouchReset()
|
||||
{
|
||||
GPIO_ResetBits(I2C_TOUCH_RESET_GPIO, I2C_TOUCH_RESET_GPIO_PIN);
|
||||
LL_GPIO_ResetOutputPin(TOUCH_RST_GPIO, TOUCH_RST_GPIO_PIN);
|
||||
delay_ms(20);
|
||||
GPIO_SetBits(I2C_TOUCH_RESET_GPIO, I2C_TOUCH_RESET_GPIO_PIN);
|
||||
LL_GPIO_SetOutputPin(TOUCH_RST_GPIO, TOUCH_RST_GPIO_PIN);
|
||||
delay_ms(300);
|
||||
}
|
||||
|
||||
@@ -502,11 +440,15 @@ void handleTouch()
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" void EXTI9_5_IRQHandler(void)
|
||||
#if !defined(TOUCH_INT_EXTI_IRQHandler)
|
||||
#error "TOUCH_INT_EXTI_IRQHandler is not defined"
|
||||
#endif
|
||||
extern "C" void TOUCH_INT_EXTI_IRQHandler(void)
|
||||
{
|
||||
if (EXTI_GetITStatus(EXTI_Line9) != RESET) {
|
||||
EXTI_ClearITPendingBit(EXTI_Line9);
|
||||
if (LL_EXTI_IsEnabledIT_0_31(TOUCH_INT_EXTI_Line) &&
|
||||
LL_EXTI_IsActiveFlag_0_31(TOUCH_INT_EXTI_Line)) {
|
||||
touchEventOccured = true;
|
||||
LL_EXTI_ClearFlag_0_31(TOUCH_INT_EXTI_Line);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -47,17 +47,6 @@ void rotaryEncoderCheck();
|
||||
|
||||
#define LUA_MEM_MAX (0) // max allowed memory usage for complete Lua (in bytes), 0 means unlimited
|
||||
|
||||
#if defined(STM32F4)
|
||||
#define PERI1_FREQUENCY 42000000
|
||||
#define PERI2_FREQUENCY 84000000
|
||||
#else
|
||||
#define PERI1_FREQUENCY 30000000
|
||||
#define PERI2_FREQUENCY 60000000
|
||||
#endif
|
||||
|
||||
#define TIMER_MULT_APB1 2
|
||||
#define TIMER_MULT_APB2 2
|
||||
|
||||
extern uint16_t sessionTimer;
|
||||
|
||||
// Board driver
|
||||
|
||||
@@ -24,10 +24,17 @@
|
||||
|
||||
#if defined(STM32F4)
|
||||
#define CPU_FREQ 168000000
|
||||
#define PERI1_FREQUENCY 42000000
|
||||
#define PERI2_FREQUENCY 84000000
|
||||
#else
|
||||
#define CPU_FREQ 120000000
|
||||
#define PERI1_FREQUENCY 30000000
|
||||
#define PERI2_FREQUENCY 60000000
|
||||
#endif
|
||||
|
||||
#define TIMER_MULT_APB1 2
|
||||
#define TIMER_MULT_APB2 2
|
||||
|
||||
// Keys
|
||||
#if defined(PCBX9E)
|
||||
#define KEYS_GPIO_REG_MENU GPIOD->IDR
|
||||
@@ -1532,17 +1539,15 @@
|
||||
#define IS_EXTERNAL_MODULE_ON() (GPIO_ReadInputDataBit(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) == Bit_SET)
|
||||
#define EXTMODULE_TX_GPIO GPIOC
|
||||
#define EXTMODULE_USART_GPIO EXTMODULE_TX_GPIO
|
||||
#define EXTMODULE_TX_GPIO_PIN GPIO_Pin_6 // PC.06
|
||||
#define EXTMODULE_TX_GPIO_PinSource GPIO_PinSource6
|
||||
#define EXTMODULE_RX_GPIO_PIN GPIO_Pin_7 // PC.07
|
||||
#define EXTMODULE_RX_GPIO_PinSource GPIO_PinSource7
|
||||
#define EXTMODULE_TX_GPIO_PIN LL_GPIO_PIN_6 // PC.06
|
||||
#define EXTMODULE_RX_GPIO_PIN LL_GPIO_PIN_7 // PC.07
|
||||
#define EXTMODULE_TIMER TIM8
|
||||
#define EXTMODULE_TIMER_Channel LL_TIM_CHANNEL_CH1
|
||||
#define EXTMODULE_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2)
|
||||
#define EXTMODULE_TIMER_IRQn TIM8_UP_TIM13_IRQn
|
||||
#define EXTMODULE_TIMER_IRQHandler TIM8_UP_TIM13_IRQHandler
|
||||
#define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH1
|
||||
#define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7
|
||||
#define EXTMODULE_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_7
|
||||
#define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1
|
||||
#define EXTMODULE_TIMER_DMA DMA2
|
||||
#define EXTMODULE_TIMER_DMA_STREAM_LL LL_DMA_STREAM_1
|
||||
@@ -1576,7 +1581,7 @@
|
||||
#define EXTMODULE_TIMER_TX_GPIO_AF GPIO_AF_TIM8 // TIM8_CH1N
|
||||
#define EXTMODULE_TIMER_IRQn TIM8_UP_TIM13_IRQn
|
||||
#define EXTMODULE_TIMER_IRQHandler TIM8_UP_TIM13_IRQHandler
|
||||
#define EXTMODULE_TIMER_DMA_CHANNEL DMA_Channel_7
|
||||
#define EXTMODULE_TIMER_DMA_CHANNEL LL_DMA_CHANNEL_7
|
||||
#define EXTMODULE_TIMER_DMA_STREAM DMA2_Stream1
|
||||
#define EXTMODULE_TIMER_DMA DMA2
|
||||
#define EXTMODULE_TIMER_DMA_STREAM_LL LL_DMA_STREAM_1
|
||||
|
||||
Reference in New Issue
Block a user