BS8116A-3驱动程序(使用STM32--STM32cubemx)。最近在用BS8116A-3这块触摸芯片,查了一下他的技术文档,里面显示从机地址是0x50,但是用示波器测试是0xA0(有点坑,MD),幸好发现了,不然不知道得调试多久。感谢示波器。
由于如果用标准库函数要自己配置IIC之类的,比较麻烦,而且容易出错,所以我是使用STM32cubemx这个软件配置好IIC,(广告:强烈推荐使用STM32cuemx软件生成程序)
extern void Delayms(unsigned int c)// 普通的延时函数
{
unsigned char a, b;
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
用STM32cubemx配置好之后就是直接在主函数写代码了,
int main(void)
{
/* MCU Configuration----------------------------------------------------------*/
float values;
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
uint8_t GetData1[5]={0};//或者的按键值存在这个数组
uint8_t GetData2[5]={0x08}//要发送的字节:0x08;
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
// MX_ADC_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
while (1)
{
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12)==0)//我自己的单片机连接BS8116A-3的中断引脚,用于触发!
{
HAL_I2C_Master_Transmit(&hi2c1,0xa0,GetData2,1,50);
HAL_I2C_Master_Receive(&hi2c1,0xa0, GetData1,2,50);
HAL_UART_Transmit(&huart1, GetData1, 2, 50);//将结果输出到串口调试助手上,便于测试
Delayms(200);
}
}
/* USER CODE END 3 */
}
至于这个主函数里面的HAL_I2C_Master_Transmit(&hi2c1,0xa0,GetData2,1,50)函数可不是直接用的,要修改里面的库,路径是在stm32l1xx_hal.c。原因是如果你有看技术手册你应该知道单片机发送数据给触摸芯片后是不能有stop停止位的,所以这个函数我们要把他里面的
/* Generate Stop */
// SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP);
上面的这一句和我一样所示注释掉,函数里面总共有两个这个SET_BIT(hi2c->Instance->CR1, I2C_CR1_STOP)函数,第一个不用注释,注释第二个,注释完后下下句有句hi2c->Mode = HAL_I2C_MODE_NONE;要修改成hi2c->Mode = HAL_I2C_MODE_MASTER;
接下来是修改HAL_I2C_Master_Receive(&hi2c1,0xa0, GetData1,2,50)这个函数里面的内容了,直接把
/* Wait until BUSY flag is reset */
// if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK)
// {
// return HAL_BUSY;
// }
这几句和我所示一样注释掉,然后就可以用了。至于为什么要注释,你如果不注释直接调试你就会发现程序会卡在这一步,所以我当初就是把它给注释掉就可以用了,奇迹!!!
然后调试应该没问题,需要的朋友们可以使用程序试试,不行的话可联系QQ:593534964进行交流