找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 765|回复: 0
打印 上一主题 下一主题
收起左侧

STM32单片机用WTC7514DSI触摸芯片IIC的问题

[复制链接]
跳转到指定楼层
楼主
ID:61632 发表于 2024-6-3 13:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
50黑币
今天用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;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表