首页 > 解决方案 > I2C 协议 使用 TM4C1294NCPDT 和 MAX6955 LED 显示驱动器

问题描述

请找到下面的代码片段,让我知道解决问题的方法。

#include <stdbool.h>
#include <stdint.h>
#include <stdarg.h>
#include "inc/hw_i2c.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_ints.h"
#include "driverlib/gpio.h"
#include "driverlib/i2c.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "driverlib/gpio.h"

#define SLAVEADDRESS_EXT 0x65
#define NUM_OF_I2CBYTES 255

#define reg_noOp 0x00
#define reg_decodeMode 0x01
#define reg_globalIntensity 0x02
#define reg_scanLimit 0x03
#define reg_controlRegister 0x04
#define reg_displayTest 0x07
#define reg_digitType 0x0C
#define reg_intensity10 0x10
#define reg_internsity32 0x11
#define reg_internsity54 0x12
#define reg_internsity76 0x13

#define USE_GLOBAL 0x00
#define USE_DISCRETE 0x40
#define RUN 0x02
#define SHUTDOWN 0x00

#define reg_digit0 0x20
#define reg_digit1 0x21
#define reg_digit2 0x22
#define reg_digit3 0x23
#define reg_digit4 0x24
#define reg_digit5 0x25
#define reg_digit6 0x26
#define reg_digit7 0x27

uint32_t ui32SysClock;

void writeI2C0( uint8_t slaveaddress, uint8_t device_register, uint8_t device_data )
{
    I2CMasterSlaveAddrSet( I2C0_BASE, SLAVEADDRESS_EXT, false );

    //register to be read
    I2CMasterDataPut( I2C0_BASE, device_register );

    //send control byte and register address byte to slave device
    I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START );

    //wait for MCU to finish transaction
    while( I2CMasterBusy( I2C0_BASE ) );

    // I2CMasterSlaveAddrSet(I2C0_BASE, device_address, true);

    //specify data to be written to the above mentioned device_register
    I2CMasterDataPut( I2C0_BASE, device_data );

    //wait while checking for MCU to complete the transaction
    I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH );

    //wait for MCU & device to complete transaction
    while( I2CMasterBusy( I2C0_BASE ) );
}

void initMAX6955( void )
{
    I2CMasterSlaveAddrSet( I2C0_BASE, SLAVEADDRESS_EXT, false );
    I2CMasterDataPut( I2C0_BASE, reg_decodeMode );
    I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_START );
    while( I2CMasterBusy( I2C0_BASE ) );

    I2CMasterDataPut( I2C0_BASE, 0xFF );
    I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT );
    while( I2CMasterBusy( I2C0_BASE ) );

    I2CMasterDataPut( I2C0_BASE, reg_globalIntensity );
    I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT );
    while( I2CMasterBusy( I2C0_BASE ) );

    I2CMasterDataPut( I2C0_BASE, 0x08 );
    I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT );
    while( I2CMasterBusy( I2C0_BASE ) );

    I2CMasterDataPut( I2C0_BASE, reg_scanLimit );
    I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT );
    while( I2CMasterBusy( I2C0_BASE ) );

    I2CMasterDataPut( I2C0_BASE, 0x07 );
    I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT );
    while( I2CMasterBusy( I2C0_BASE ) );

    I2CMasterDataPut( I2C0_BASE, reg_controlRegister );
    I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT );
    while( I2CMasterBusy( I2C0_BASE ) );

    I2CMasterDataPut( I2C0_BASE, 0x01 );
    I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT );
    while( I2CMasterBusy( I2C0_BASE ) );

    I2CMasterDataPut( I2C0_BASE, reg_digitType );
    I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT );
    while( I2CMasterBusy( I2C0_BASE ) );

    I2CMasterDataPut( I2C0_BASE, 0xFF );
    I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT );
    while( I2CMasterBusy( I2C0_BASE ) );

    I2CMasterDataPut( I2C0_BASE, reg_displayTest );
    I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_CONT );
    while( I2CMasterBusy( I2C0_BASE ) );

    I2CMasterDataPut( I2C0_BASE, 0x01 );
    I2CMasterControl( I2C0_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH );
    while( I2CMasterBusy( I2C0_BASE ) );
}

void InitConsole( void )
{
    SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOA );
    GPIOPinConfigure( GPIO_PA0_U0RX );
    GPIOPinConfigure( GPIO_PA1_U0TX );
    SysCtlPeripheralEnable( SYSCTL_PERIPH_UART0 );
    UARTClockSourceSet( UART0_BASE, UART_CLOCK_PIOSC );
    GPIOPinTypeUART( GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1 );
    UARTStdioConfig( 0, 115200, 16000000 );
}

int main( void )
{
    ui32SysClock = SysCtlClockFreqSet( (SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_240), 80000000 );
    SysCtlPeripheralEnable( SYSCTL_PERIPH_I2C0 );
    SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOB );
    GPIOPinConfigure( GPIO_PB2_I2C0SCL );
    GPIOPinConfigure( GPIO_PB3_I2C0SDA );
    GPIOPinTypeI2CSCL( GPIO_PORTB_BASE, GPIO_PIN_2 );
    GPIOPinTypeI2C( GPIO_PORTB_BASE, GPIO_PIN_3 );

    I2CMasterEnable( I2C0_BASE );
    I2CMasterInitExpClk( I2C0_BASE, ui32SysClock, false );

    InitConsole();

    UARTprintf( "The slave address: %X\n", SLAVEADDRESS_EXT );

    initMAX6955();

    while( 1 )
    {
        writeI2C0( SLAVEADDRESS_EXT, reg_digit1, 0x41 );
        writeI2C0( SLAVEADDRESS_EXT, reg_digit2, 0x58 );
        writeI2C0( SLAVEADDRESS_EXT, reg_digit3, 0x49 );
        writeI2C0( SLAVEADDRESS_EXT, reg_digit4, 0x4D );
        writeI2C0( SLAVEADDRESS_EXT, reg_digit5, 0x2D );
        writeI2C0( SLAVEADDRESS_EXT, reg_digit4, 0x49 );
        writeI2C0( SLAVEADDRESS_EXT, reg_digit5, 0x43 );

    }
}

我正在尝试开发 I2C 通信协议以在 MAX6955 上显示相应的数字。之前,我将数据写入数字。我必须初始化 MAX6955 显示驱动程序。

它似乎没有响应,无法将数据写入 Digit。

请看一下,让我知道故障排除或不同的方法。

标签: cembeddedmicrocontrolleri2c

解决方案


推荐阅读