mcu io模拟i2c 驱动tca6424a

本文档详细介绍了TCA6424A I2C智能接口芯片的初始化配置,包括I2C1和I2C2的通信函数,以及如何通过I2C与TCA6424A进行数据交换以控制LED矩阵。涵盖了关键操作如配置输入输出、读写寄存器和处理按键输入。


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#ifndef __TCA6424A_H__
#define __TCA6424A_H__

#include <stdint.h>
#include "NUC123.h"

#define CLOSE_LED		0
#define CHANNEL_SELECT	1
#define MODE_SELECT		2
#define VOLT2			3
#define TRIGGER			4
#define	VOLT1			5
#define FREQ			6
#define CH1				7
#define CH2				8
#define CH3				9
#define CH4				10
#define CH5				11
#define CH6				12

#define I2C1_SDA_OUT()   GPIO_SetMode(PA, BIT10, GPIO_PMD_QUASI)
#define I2C1_SDA_IN()    GPIO_SetMode(PA, BIT10, GPIO_PMD_QUASI)
#define I2C1_READ_SDA    (PA10)

#define I2C1_INT    (PB12)
#define I2C1_SCL    (PA11)
#define I2C1_SDA    (PA10)
#define I2C1_RESET  (PD8)

#define I2C2_SDA_OUT()   GPIO_SetMode(PF, BIT2, GPIO_PMD_QUASI)
#define I2C2_SDA_IN()    GPIO_SetMode(PF, BIT2, GPIO_PMD_QUASI)
#define I2C2_READ_SDA    (PF2)

#define I2C2_INT    (PB8)
#define I2C2_SCL    (PF3)
#define I2C2_SDA    (PF2)
#define I2C2_RESET  (PB15)


/************************** I2C Address ***************************************/
#define TCA6424A_IIC_ADDR			0x22 		// I2C Address 0100 01 + ADDR + R/W
												// ADDR tied to P2.3 of LaunchPad
/************************** I2C Registers *************************************/
#define TCA6424A_INPUT_REG0			0x00		// Input status register
#define TCA6424A_INPUT_REG1			0x01		// Input status register
#define TCA6424A_INPUT_REG2			0x02		// Input status register
#define TCA6424A_OUTPUT_REG0		0x04		// Output register to change state of output BIT set to 1, output set HIGH
#define TCA6424A_OUTPUT_REG1		0x05		// Output register to change state of output BIT set to 1, output set HIGH
#define TCA6424A_OUTPUT_REG2		0x06		// Output register to change state of output BIT set to 1, output set HIGH
#define TCA6424A_POLARITY_REG0 	    0x08		// Polarity inversion register. BIT '1' inverts input polarity of register 0x00
#define TCA6424A_POLARITY_REG1 	    0x09		// Polarity inversion register. BIT '1' inverts input polarity of register 0x00
#define TCA6424A_POLARITY_REG2 	    0x0A		// Polarity inversion register. BIT '1' inverts input polarity of register 0x00
#define TCA6424A_CONFIG_REG0   	    0x0C		// Configuration register. BIT = '1' sets port to input BIT = '0' sets port to output
#define TCA6424A_CONFIG_REG1   	    0x0D		// Configuration register. BIT = '1' sets port to input BIT = '0' sets port to output
#define TCA6424A_CONFIG_REG2   	    0x0E		// Configuration register. BIT = '1' sets port to input BIT = '0' sets port to output

#define TCA6424A_LOW                0
#define TCA6424A_HIGH               1
#define TCA6424A_POLARITY_NORMAL    0
#define TCA6424A_POLARITY_INVERTED  1
#define TCA6424A_OUTPUT             0
#define TCA6424A_INPUT              1
#define TCA6424A_AUTO_INCREMENT     0x80
#define TCA6424A_IO_ALL				0xFF

#define IS_BIT_LOW(num, x)			(num & (1 << x) ? 0 : 1)

typedef struct TCA6424A_KEY
{
   
   
	uint8_t key[13];
}I2C_KEY_T;

typedef struct TCA6424A_IO
{
   
   
	uint8_t io[6];
}I2C_IO_T;


typedef struct TCA6424A_LED
{
   
   
	uint8_t led[12];
}I2C_LED_T;

void tca6424a_io_init(void);
void tca6424a_io_int_init(void);
void tca6424a_key_init(void);
void tca6424a_key_int_init(void);
void GPAB_IRQHandler(void);

uint8_t i2c1_read_reg(uint8_t reg);
void i2c1_conf_reg(uint8_t reg, uint8_t data);
void i2c1_write_pin(uint8_t reg, uint8_t read_data, uint8_t pin, uint8_t state);

uint8_t i2c2_read_reg(uint8_t reg);
void i2c2_conf_reg(uint8_t reg, uint8_t data);
void i2c2_write_pin(uint8_t reg, uint8_t read_data, uint8_t pin, uint8_t state);

void key_handler(uint8_t *data);
void led_handler(uint8_t *in_data);

#endif
#include "tca6424a.h"
#include <stdlib.h>
#include <stdio.h>
#include "system_NUC123.h"
//menu.c
extern uint8_t volt_disp_reset, volt_disp_mutex;

uint8_t key_led_flag = 0;
uint8_t key_value_tca6424a[3] = {
   
   0};
I2C_KEY_T i2c_key = {
   
   0};
I2C_LED_T i2c_led = {
   
   0};
//产生IIC起始信号
static void I2C1_Start(void)
{
   
   
    I2C1_SDA_OUT();     //sda线输出
    I2C1_SDA = 1;
    I2C1_SCL = 1;
    delay_us(4);
    I2C1_SDA = 0;//START:when CLK is high,DATA change form high to low
    delay_us(4);
    I2C1_SCL = 0;//钳住I2C总线,准备发送或接收数据
}

//产生IIC停止信号
static void I2C1_Stop(void)
{
   
   
    I2C1_SDA_OUT();//sda线输出
    I2C1_SCL = 0;
    I2C1_SDA = 0;//STOP:when CLK is high DATA change form low to high
    delay_us(4);
    I2C1_SCL = 1;
    delay_us(4);
    I2C1_SDA = 1;//发送I2C总线结束信号
    delay_us(4);
}

//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
static uint8_t I2C1_Wait_Ack(void)
{
   
   
    uint8_t time = 0;
    I2C1_SDA_IN();      //SDA设置为输入  
    I2C1_SDA = 1;
    delay_us(4);
    I2C1_SCL = 1;
    delay_us(4);
    while (I2C1_READ_SDA)
    {
   
   
        time++;
        if (time > 250)
        {
   
   
            I2C1_Stop();
            return 1;
        }
    }
    I2C1_SCL = 0;//时钟输出0
    return 0;
}

//产生ACK应答
static void I2C1_Ack(void)
{
   
   
    I2C1_SCL = 0;
    I2C1_SDA_OUT();
    I2C1_SDA = 0;
    delay_us(4);
    I2C1_SCL = 1;
    delay_us(4);
    I2C1_SCL = 0;
}

//不产生ACK应答		    
static void I2C1_NAck(void)
{
   
   
    I2C1_SCL = 0;
    I2C1_SDA_OUT();
    I2C1_SDA = 1;
    delay_us(4);
    I2C1_SCL = 1;
    delay_us(4);
    I2C1_SCL = 0;
}

//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答			  
static void I2C1_Send_Byte(uint8_t txd)
{
   
                           
    uint8_t t = 0;
    I2C1_SDA_OUT();
    I2C1_SCL = 0;//拉低时钟开始数据传输
    for (t = 0; t < 8; t++)
    {
   
   
        I2C1_SDA = ((txd & 0x80) >> 7);
        txd <<= 1;
        delay_us(4);   //对TEA5767这三个延时都是必须的
        I2C1_SCL = 1;
        delay_us(4);
        I2C1_SCL = 0;
        delay_us(
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值