
请教各位前辈 小弟在做BS8116A-3 initial时卡在下面(红色)这一行就不会往下跑了,很苦脑.. /* BS8116A-3 write setting Register */ I2C_TransferHandling(I2C1, 0x50, 22, I2C_Reload_Mode,I2C_Generate_Start_Read); (ochar('a')); I2C_SendData(I2C1, 0xB0); (ochar('g')); while(I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR)==RESET ); (ochar('b')); I2C_SendData(I2C1, 0x00); //Option1 (ochar('c')); while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXE)==RESET ); (ochar('d')); I2C_SendData(I2C1, 0x00); //Reserve (ochar('e')); while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) ==RESET); (ochar('f')); I2C_SendData(I2C1, 0x83); //Reserve while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0xF3); //Reserve while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x98); //Option2 while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K1_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K2_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K3_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K4_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K5_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K6_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K7_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K8_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K9_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K10_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K11_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K12_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K13_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K14_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K15_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K16_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0xEE); //checksum (get low byte) (ochar('z')); 完整程式如下 ====================================================================== /* code */ #include "firmware.h" #include "flags.h" my_ubyte GlobeOption[ ]; // jimmy add my_ubyte flag[1]; volatile my_uint32 tmcount; volatile uarts uart; my_uint32 buzzer_count; static USART_InitTypeDef USART_InitStructure; static void InitPortA(void); static void InitPortB(void); static void InitSysTick(void); static void Init_NVICSetup(void); static void Init_BS8116A_3(void); //jimmy add void InitialGlobal(void); // jimmy add static void Init_UART0Config(void); void I2C1_Write(unsigned char data, unsigned char WriteAddr); unsigned char I2C1_Read(unsigned char ReadAddr); void init(void) { Init_NVICSetup(); InitPortA(); InitPortB(); Init_UART0Config(); InitSysTick(); Init_BS8116A_3(); InitialGlobal(); } void reset(void) { NVIC_SystemReset(); } /********************************** * ���GPIO * *******************************/ static void InitPortA(void) { GPIO_InitTypeDef GPIO_InitStructure; /* GPIOA Periph clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE); /* �����SART1��PIO TX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* �����SART1��PIO RX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Connect PA9 to USART1_TX */ GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1); /* Connect PA10 to USART1_RX */ GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1); } static void InitPortB(void) { GPIO_InitTypeDef GPIO_InitStructure; /* GPIOB Periph clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); /*Configure GPIO pin for LCD Controller */ /*Configure GPIO pin for LCD Controller */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; // Jimmy SCL SDA GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_1); GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_1); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); } static void InitSysTick(void) { /* SysTick */ if (SysTick_Config(SystemCoreClock / 1000)) { /* Capture error */ while (1); } } static void Init_NVICSetup(void) { NVIC_InitTypeDef NVIC_InitStructure; /* NVIC configuration */ /* Enable the USARTx Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void beep(void) { /* if(~IS_CLOSE_BEEP) */ { GPIOB->BSRR = GPIO_Pin_4; buzzer_count = tmcount; SET_BUZZER; } } void stpbeep(void) { GPIOB->BRR = GPIO_Pin_4; CLR_BUZZER; } static void Init_UART0Config(void) { /* Enable USART1 clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /* USARTx configured as follow: - BaudRate = 9600 baud - Word Length = 8 Bits - One Stop Bit - None parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitStructure.USART_BaudRate =9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStructure); /* Enable the USARTx Receive interrupt: this interrupt is generated when the USARTx receive data register is not empty */ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); /* Enable USART */ USART_Cmd(USART1, ENABLE); init_uart(); } void init_uart(void) { uart.rsflags = 0; uart.rq0 = 0; uart.rq1 = 0; uart.tq0 = 0; uart.tq1 = 0; SET_SEDEND; } my_byte ochar(my_ubyte c) { my_byte tx; tx=uart.tq1; tx++; if(tx==UART_BUF_LEN) tx=0; if(tx!=uart.tq0) { uart.tbuffer[uart.tq1]=c; uart.tq1=tx; USART_ITConfig(USART1,USART_IT_TXE,ENABLE); while(!IS_SEDEND); CLR_SEDEND; return 0; } else return -1; } my_int16 ichar(void) { if(uart.rq0 != uart.rq1) { my_int16 h; h = uart.rbuffer[uart.rq0++]; if(uart.rq0 == UART_BUF_LEN) uart.rq0 = 0; return h; } else return -1; } static void Init_BS8116A_3(void) { I2C_InitTypeDef I2C_InitStructure; /* Configure the I2C clock source. The clock is derived from the HSI */ RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK); /*!< I2C Periph clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); // 启用 I2C1 的 RCC 时钟 //*I2C configuration I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; // I2C 模式 I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable; I2C_InitStructure.I2C_DigitalFilter = 0x00; I2C_InitStructure.I2C_OwnAddress1 = 0x00; // own address, not relevant in master mode I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; // 设定 I2C 地址长度为 7 bit //I2C_InitStructure.I2C_Timing = 0x00901D2B; I2C_InitStructure.I2C_Timing = 0x00201D2B/*0x1045061D*//*0x00210507*//*0xB0420F13*//*0xFFFFFFFF*/; /* Apply I2C configuration after enabling it */ I2C_Init(I2C1, &I2C_InitStructure); // 初始化 I2C1 /* I2C Peripheral Enable */ I2C_Cmd(I2C1, ENABLE); // 启用 I2C1 /* BS8116A-3 write setting Register */ I2C_TransferHandling(I2C1, 0x50, 22, I2C_Reload_Mode,I2C_Generate_Start_Read); (ochar('a')); I2C_SendData(I2C1, 0xB0); (ochar('g')); while(I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR)==RESET ); (ochar('b')); I2C_SendData(I2C1, 0x00); //Option1 (ochar('c')); while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXE)==RESET ); (ochar('d')); I2C_SendData(I2C1, 0x00); //Reserve (ochar('e')); while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) ==RESET); (ochar('f')); I2C_SendData(I2C1, 0x83); //Reserve while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0xF3); //Reserve while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x98); //Option2 while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K1_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K2_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K3_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K4_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K5_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K6_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K7_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K8_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K9_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K10_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K11_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K12_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K13_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K14_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K15_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0x08); //K16_TH while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS)==RESET ); I2C_SendData(I2C1, 0xEE); //checksum (get low byte) (ochar('z')); } void InitialGlobal(void) { GlobeOption[0]=0; GlobeOption[1]=0; GlobeOption[2]=GlobeOptionA; GlobeOption[3]=GlobeOptionB; GlobeOption[4]=GlobeOptionC; GlobeOption[5] =Key1Threshold; GlobeOption[6] =Key2Threshold; GlobeOption[7]=Key3Threshold; GlobeOption[8]=Key4Threshold; GlobeOption[9]=Key5Threshold; GlobeOption[10]=Key6Threshold; GlobeOption[11]=Key7Threshold; GlobeOption[12]=Key8Threshold; GlobeOption[13]=Key9Threshold; GlobeOption[14]=Key10Threshold; GlobeOption[15]=Key11Threshold; GlobeOption[16]=Key12Threshold; GlobeOption[17]=Key13Threshold; GlobeOption[18]=Key14Threshold; GlobeOption[19]=Key15Threshold; GlobeOption[20]=Key16Threshold; } //******************************************************************************* // : void I2C2_Write(unsigned char data, unsigned char WriteAddr) //****************************************************************************** void I2C1_Write(unsigned char data, unsigned char WriteAddr) { I2C_TransferHandling(I2C1, 0x50, 1, I2C_Reload_Mode, I2C_Generate_Start_Write); while(I2C_GetFlagStatus(I2C1, I2C_ISR_TXIS) == RESET); I2C_SendData(I2C1, WriteAddr); while(I2C_GetFlagStatus(I2C1, I2C_ISR_TCR) == RESET); I2C_TransferHandling(I2C1, 0x50, 1, I2C_AutoEnd_Mode, I2C_No_StartStop); while(I2C_GetFlagStatus(I2C1, I2C_ISR_TXIS) == RESET); I2C_SendData(I2C1, data); while(I2C_GetFlagStatus(I2C1, I2C_ISR_STOPF) == RESET); I2C_ClearFlag(I2C1, I2C_ICR_STOPCF); } //******************************************************************************* // : unsigned char I2C1_Read(unsigned char ReadAddr) //****************************************************************************** unsigned char I2C1_Read(unsigned char ReadAddr) { unsigned char temp; ochar('D'); I2C_TransferHandling(I2C1, 0x50, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write); ochar('E'); while(I2C_GetFlagStatus(I2C1, I2C_ISR_TXIS) == SET); ochar('F'); I2C_SendData(I2C1, ReadAddr); ochar('G'); while(I2C_GetFlagStatus(I2C1, I2C_ISR_TC) == SET); ochar('H'); I2C_TransferHandling(I2C1, 0x50, 1, I2C_AutoEnd_Mode, I2C_Generate_Start_Read); ochar('I'); while(I2C_GetFlagStatus(I2C1, I2C_ISR_RXNE) == SET); ochar('J'); temp = I2C_ReceiveData(I2C1); ochar('K'); while(I2C_GetFlagStatus(I2C1, I2C_ISR_STOPF) == SET); ochar('L'); I2C_ClearFlag(I2C1, I2C_ICR_STOPCF); ochar('M'); return temp; ochar('N'); } |
【STM32F0开发日志/评测/笔记】+互补PWM波的产生
STM32F030 PB14和PB15无法输出PWM求助
【STM32F030探索套件】序列之五 外部中断
【STM32F0开发日志---二】+ucosii.2.92移植在STM32F030
上传个STM32F0+5110+内部温度传感器的菜鸟实例
【STM32F030探索套件使用问题】STM32F030 SPI方式驱动ST7565LCD失败
求一份STM32F051 I2C驱动LCD 12864的例程
STM32F0 M0 向结构体赋值进入HardFault异常
STM32F0 ADC-DMA方式采集2路数据时出现问题
STM32F030C8T6,TIM16定时慢很多问题?
调了一个周
http://blog.csdn.net/beep_/article/details/61423951
我也遇到与你相同的问题,现在刚调通 分享给你吧
http://blog.csdn.net/beep_/article/details/61423951
谢谢啦
我也用IO模拟的方式;我现在的问题就是,触摸分析出来的结果 成功率很低;经常误触发;请问在按键值分析方面有什么需要注意的么?我采用的方式是switch分析,每次只能有一个按键被触摸,多个按键触摸就会返回错误值
我的IIC倒是通了,设置寄存器值都没问题;但是触摸按键的返回值经常是错的,比如触摸的是KEY;有可能会返回key6被触摸的值
用IO模拟方式,需要接上拉电阻么
需要,IIC都是需要上拉的
这个IC貌似不需要,我现在的问题,就是KEY的识别 成功率不高;这个里面应该不存在什么软件算法吧;我倒是认为跟PCB关系很大;我现在这个板子上按键的铜箔面积不大;如何提高按键识别的成功率,能指点下么
求分享,如何提高按键识别 的成功率