NV14 touch driver

This commit is contained in:
Raphael Coeffic
2022-06-25 16:09:04 +02:00
committed by Raphael Coeffic
parent f8d1e4143b
commit 244efed6ba
11 changed files with 180 additions and 222 deletions
@@ -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();
-5
View File
@@ -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;
+11 -11
View File
@@ -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
-6
View File
@@ -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)
+33 -13
View File
@@ -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
+110 -168
View File
@@ -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);
}
}
-11
View File
@@ -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
+11 -6
View File
@@ -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