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進行交流