欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STM32單片機用WTC7514DSI觸摸芯片IIC的問題
[打印本頁]
作者:
seaup2011
時間:
2024-6-3 13:46
標題:
STM32單片機用WTC7514DSI觸摸芯片IIC的問題
今天用STM32F103C8T6單片機I/O口模擬IIC與WTC7514DSI觸摸芯片通訊問題,按觸摸按鍵,沒有反應,想向各位請教一下,代碼有沒有問題
/****************
main.c文件開始
****************/
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "Key.h"
#include "Demo_iic_7514.h"
#include "stm32f10x.h"
u16 tim4Cnt=5000;
u8 k=0;
u16 sec=0,min=0,hour=00;
extern u16 count;
extern u8 Flag_off;
// u16 count=0;
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
int main()
{
SysTick_Init(72);
LED_Init();
IIC_Init();
u16 u16_key_value;
fun_wtc7514dsi_write_data(15);
delay_ms(50);
while(1)
{
u16_key_value=fun_wtc7514dsi_read_data();
//u16_key_value &= 0x0FF8;
if(u16_key_value==KEY1_VALUE)
{
D1_LED=1;
}
else
D1_LED=0;
}
}
/****************
key.c文件開始
****************/
#include "SysTick.h"
#include "Demo_iic_7514.h"
#include "Key.h"
#include "led.h"
u8 Flag_off=0,Flag_Fun=0,Flag_add=0,Flag_Redu=0;
u16 fun_wtc7514dsi_read_data(void)
{
u8 u8_high=0;
u8 u8_low=0;
u16 u16_key_value=0;
IIC_Start();
IIC_Send_Byte(0x71);
if(IIC_Wait_Ack())
{
return 0;
}
u8_high=IIC_Read_Byte(1);
u8_low=IIC_Read_Byte(0);
u16_key_value= (u8_high<<8) | u8_low;
IIC_Stop();
return u16_key_value;
}
void fun_wtc7514dsi_write_data(u8 u8_data)
{
IIC_Start();
IIC_Send_Byte(0x70);
IIC_Wait_Ack();
IIC_Send_Byte(u8_data);
IIC_Stop();
}
/****************
Demo_iic_7514.h文件開始
****************/
#ifndef _Demo_iic_7514_H
#define _Demo_iic_7514_H
#include "system.h"
/* IIC_SCL時鐘端口、引腳定義 */
#define IIC_SCL_PORT GPIOB
#define IIC_SCL_PIN (GPIO_Pin_4)
#define IIC_SCL_PORT_RCC RCC_APB2Periph_GPIOB
/* IIC_SDA時鐘端口、引腳定義 */
#define IIC_SDA_PORT GPIOB
#define IIC_SDA_PIN (GPIO_Pin_5)
#define IIC_SDA_PORT_RCC RCC_APB2Periph_GPIOB
//IO操作函數
#define IIC_SCL PBout(4) //SCL
#define IIC_SDA PBout(5) //SDA
#define READ_SDA PBin(5) //輸入SDA
//IIC所有操作函數
void IIC_Init(void); //初始化IIC的IO口
void IIC_Start(void); //發送IIC開始信號
void IIC_Stop(void); //發送IIC停止信號
void IIC_Send_Byte(u8 txd); //IIC發送一個字節
u8 IIC_Read_Byte(u8 ack); //IIC讀取一個字節
u8 IIC_Wait_Ack(void); //IIC等待ACK信號
void IIC_Ack(void); //IIC發送ACK信號
void IIC_NAck(void); //IIC不發送ACK信號
#endif
/****************
Demo_iic_7514.C文件開始
****************/
#include "Demo_iic_7514.h"
#include "SysTick.h"
/*******************************************************************************
* 函 數 名 : IIC_Init
* 函數功能 : IIC初始化
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
IIC_SCL=1;
IIC_SDA=1;
}
/*******************************************************************************
* 函 數 名 : SDA_OUT
* 函數功能 : SDA輸出配置
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=IIC_SDA_PIN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(IIC_SDA_PORT,&GPIO_InitStructure);
}
/*******************************************************************************
* 函 數 名 : SDA_IN
* 函數功能 : SDA輸入配置
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=IIC_SDA_PIN;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(IIC_SDA_PORT,&GPIO_InitStructure);
}
/*******************************************************************************
* 函 數 名 : IIC_Start
* 函數功能 : 產生IIC起始信號
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void IIC_Start(void)
{
SDA_OUT(); //sda線輸出
IIC_SDA=1;
IIC_SCL=1;
delay_us(5);
IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(6);
IIC_SCL=0;//鉗住I2C總線,準備發送或接收數據
}
/*******************************************************************************
* 函 數 名 : IIC_Stop
* 函數功能 : 產生IIC停止信號
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void IIC_Stop(void)
{
SDA_OUT();//sda線輸出
IIC_SCL=0;
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(6);
IIC_SCL=1;
IIC_SDA=1;//發送I2C總線結束信號
delay_us(6);
}
/*******************************************************************************
* 函 數 名 : IIC_Wait_Ack
* 函數功能 : 等待應答信號到來
* 輸 入 : 無
* 輸 出 : 1,接收應答失敗
0,接收應答成功
*******************************************************************************/
u8 IIC_Wait_Ack(void)
{
u8 tempTime=0;
SDA_IN(); //SDA設置為輸入
IIC_SDA=1;
delay_us(1);
IIC_SCL=1;
delay_us(1);
while(READ_SDA)
{
tempTime++;
if(tempTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//時鐘輸出0
return 0;
}
/*******************************************************************************
* 函 數 名 : IIC_Ack
* 函數功能 : 產生ACK應答
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(5);
IIC_SCL=0;
}
/*******************************************************************************
* 函 數 名 : IIC_NAck
* 函數功能 : 產生NACK非應答
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(5);
IIC_SCL=0;
}
/*******************************************************************************
* 函 數 名 : IIC_Send_Byte(u8 txd)
* 函數功能 : 向IIC發送一個8字節數據,并請求一個應答信號ACK,如果成功收到ACK返回1,否則返回0.
* 輸 入 : txd:需要發送到IIC從機的數據
* 輸 出 : 收到I2C的ACK信號,返回1(TRUE),否則為0(false)
*******************************************************************************/
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;//拉低時鐘開始數據傳輸
for(t=0;t<8;t++)
{
if((txd&0x80)>>7) //0x80 1000 0000
IIC_SDA=1;
else
IIC_SDA=0;
txd<<=1;
delay_us(1); //對TEA5767這三個延時都是必須的
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(1);
}
}
/*******************************************************************************
* 函 數 名 : IIC_Read_Byte
* 函數功能 : IIC讀一個字節
* 輸 入 : ack=1時,發送ACK,ack=0,發送nACK
* 輸 出 : 應答或非應答
*******************************************************************************/
u8 IIC_Read_Byte(u8 ack)
{
u8 i,receive=0;
u8 u8_data;
u8 ucErrTime = 0;
for (i = 0; i < 8; i++)
{
IIC_SCL=0;
u8_data = receive;
SDA_IN();
IIC_SCL=1;
u8_data <<= 1;
receive = u8_data;
ucErrTime = 0;
while (READ_SDA)
{
ucErrTime++;
if (ucErrTime > 250 || i > 0)
{
receive |= 0x01; //讀到數據1
break;
}
}
if (READ_SDA)
{
receive |= (1 << i);
}
}
if (!ack)
{
IIC_NAck();
}
else
{
IIC_Ack();
}
return receive;
}
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1