




#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(
TCA6424A I2C接口驱动与LED矩阵控制

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

被折叠的 条评论
为什么被折叠?



