|
50黑幣
今天用STM32F103C8T6單片機(jī)I/O口模擬IIC與WTC7514DSI觸摸芯片通訊問題,按觸摸按鍵,沒有反應(yīng),想向各位請教一下,代碼有沒有問題
/****************
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;
/*******************************************************************************
* 函 數(shù) 名 : main
* 函數(shù)功能 : 主函數(shù)
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
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操作函數(shù)
#define IIC_SCL PBout(4) //SCL
#define IIC_SDA PBout(5) //SDA
#define READ_SDA PBin(5) //輸入SDA
//IIC所有操作函數(shù)
void IIC_Init(void); //初始化IIC的IO口
void IIC_Start(void); //發(fā)送IIC開始信號
void IIC_Stop(void); //發(fā)送IIC停止信號
void IIC_Send_Byte(u8 txd); //IIC發(fā)送一個字節(jié)
u8 IIC_Read_Byte(u8 ack); //IIC讀取一個字節(jié)
u8 IIC_Wait_Ack(void); //IIC等待ACK信號
void IIC_Ack(void); //IIC發(fā)送ACK信號
void IIC_NAck(void); //IIC不發(fā)送ACK信號
#endif
/****************
Demo_iic_7514.C文件開始
****************/
#include "Demo_iic_7514.h"
#include "SysTick.h"
/*******************************************************************************
* 函 數(shù) 名 : IIC_Init
* 函數(shù)功能 : 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;
}
/*******************************************************************************
* 函 數(shù) 名 : SDA_OUT
* 函數(shù)功能 : 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);
}
/*******************************************************************************
* 函 數(shù) 名 : SDA_IN
* 函數(shù)功能 : 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);
}
/*******************************************************************************
* 函 數(shù) 名 : IIC_Start
* 函數(shù)功能 : 產(chǎn)生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總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
}
/*******************************************************************************
* 函 數(shù) 名 : IIC_Stop
* 函數(shù)功能 : 產(chǎn)生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;//發(fā)送I2C總線結(jié)束信號
delay_us(6);
}
/*******************************************************************************
* 函 數(shù) 名 : IIC_Wait_Ack
* 函數(shù)功能 : 等待應(yīng)答信號到來
* 輸 入 : 無
* 輸 出 : 1,接收應(yīng)答失敗
0,接收應(yīng)答成功
*******************************************************************************/
u8 IIC_Wait_Ack(void)
{
u8 tempTime=0;
SDA_IN(); //SDA設(shè)置為輸入
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;
}
/*******************************************************************************
* 函 數(shù) 名 : IIC_Ack
* 函數(shù)功能 : 產(chǎn)生ACK應(yīng)答
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(5);
IIC_SCL=0;
}
/*******************************************************************************
* 函 數(shù) 名 : IIC_NAck
* 函數(shù)功能 : 產(chǎn)生NACK非應(yīng)答
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(5);
IIC_SCL=0;
}
/*******************************************************************************
* 函 數(shù) 名 : IIC_Send_Byte(u8 txd)
* 函數(shù)功能 : 向IIC發(fā)送一個8字節(jié)數(shù)據(jù),并請求一個應(yīng)答信號ACK,如果成功收到ACK返回1,否則返回0.
* 輸 入 : txd:需要發(fā)送到IIC從機(jī)的數(shù)據(jù)
* 輸 出 : 收到I2C的ACK信號,返回1(TRUE),否則為0(false)
*******************************************************************************/
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;//拉低時鐘開始數(shù)據(jù)傳輸
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);
}
}
/*******************************************************************************
* 函 數(shù) 名 : IIC_Read_Byte
* 函數(shù)功能 : IIC讀一個字節(jié)
* 輸 入 : ack=1時,發(fā)送ACK,ack=0,發(fā)送nACK
* 輸 出 : 應(yīng)答或非應(yīng)答
*******************************************************************************/
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; //讀到數(shù)據(jù)1
break;
}
}
if (READ_SDA)
{
receive |= (1 << i);
}
}
if (!ack)
{
IIC_NAck();
}
else
{
IIC_Ack();
}
return receive;
}
|
|