今天用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;
}
|