我必须使用 TMS320DM6446的 I2C 外设对 PCA2129进行写入和读取。
我正在检查在示波器上从 TMS320DM6446的 I2C 发出的数据、该数据与写入代码的实际数据不匹配。
请建议问题可能是什么?
使用的代码如下所示:
#include "stdio.h"
#include "davincievm.h"
#include "davincievm_uart.h"
#include
#include
#include
#include "stdlib.h"
#include "davincievm.h"
#include "string.h"
void main( void )
{
uint32 i;
uint32 jj;
unsigned char add_regI2c=0、I2C_len=0、I2C_SLAddr、cntRD;
DAVINCIEVM_GPIO_init();
PINMUX0 &=0xffffff7fE0;
DAVINCIEVM_GPIO_setDirection (12、0);
DAVINCIEVM_GPIO_setOutput (12、1);
PINMUX1 &=0xffffff7f;
PINMUX1 |=0x00000080;
DAVINCIEVM_I2C_RESET();
add_regI2c=0x03;
//I2C_len = 0x02;
//I2C_SLAddr = 0xA2;
while (1)
{
DAVINCIEVM_I2C_WRITE (0xA2、&add_regI2c、3);
DAVINCIEVM_I2C_READ (0xA3、&RDsec、0x01);
cntRD++;
}
}
//将以下文件添加为头文件/源文件/include 文件
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
* Copyright 2005 by Spectrum Digital Incorporated。
* 保留所有权利。 Spectrum Digital Incorporated 的财产。
*
* 不可分发。
*
/*
* I2C 实现
*
*
#include "davincievm_i2c.h"
/*---------------------------------------------- *
* *
* DAVINCIEVM_I2C_INIT() *
* *
* 启用并初始化 I2C 模块 *
* *
* I2C 时钟设置为以20KHz 运行 *
* *
******************************************************************************************************* *
int16 DAVINCIEVM_I2C_init()
{
#ifdef ARM_SIDE
CSL_Status 状态;
CSL_I2cClkSetup i2c_clksetup;
CSL_I2cHwSetup i2c_hwsetup;
CSL_I2cParam i2c_param;
CSL_i2cInit(0);
I2C_Handle = CSL_i2cOpen (&i2c_obj、0、&i2c_param、&status);
I2C_clksetup.prescalar = 26;
I2C_clksetup.clklowdiv = 20;
i2C_clksetup.clkhighdiv = 20;
I2C_hwsetup.mode = 1; // 0:从模式 1:主模式
I2C_hwsetup.dir = 0; // 0:Rx 模式 1:TX 模式
I2C_hwsetup.addrMode = 0; // 0:7位模式 1:10位模式//0
I2C_hwsetup.sttbyteen = 0; // 0:正常模式 1:起始字节模式//0
I2C_hwsetup.ownaddr = 1; //#:自有地址//0
I2C_hwsetup.ackMode = 0; // 0:ACK 模式 1:NACK 模式
i2c_hwsetup.runMode = 0; // 0:无自由运行模式 1:自由运行模式//
I2C_hwsetup.repeMode = 0; // 0:无重复模式 1:重复模式
I2C_hwsetup.loopBackMode = 0; // 0:无环回 1:环回模式//0
i2c_hwsetup.freeDataFormat = 0; // 0:无可用数据 fmt 1:免费数据 fmt
I2C_hwsetup.resetMode = 1; // 0:复位 1:超出复位范围//0
I2C_hwsetup.bcm = 0; // 0:不兼容 1:兼容
i2c_hwsetup.inten = 0; //#:INTR 使能掩码
i2C_hwsetup.clksetup =&i2c_clksetup;
status = CSL_i2cHwSetup( i2c_handle,&i2c_hwsetup );
CSL_i2cHwControl (i2c_handle、CSL_I2C_CMD_OUTOFRESET,0);
返回0;
#Elif DSP_Side
I2C_ICMDR = 0; //复位 I2C
I2C_ICPSC = 26; //配置27MHz 的预分频器
I2C_ICCLKL = 5; //针对50kHz 配置 clk 为低电平
I2C_ICCLKH = 5; //针对50kHz 配置 clk 为高电平
I2C_ICMDR |= ICMDR_IRS; //从复位状态释放 I2C
返回0;
#endif
}
/*---------------------------------------------- *
* *
* DAVINCIEVM_I2C_CLOSE () *
* *
******************************************************************************************************* *
Int16 DAVINCIEVM_I2C_CLOSE ()
{
#ifdef ARM_SIDE
cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_RESET、0);
cSL_i2cClose (i2c_handle);
返回0;
#Elif DSP_Side
I2C_ICMDR = 0; //复位 I2C
返回0;
#endif
}
/*---------------------------------------------- *
* *
* DAVINCIEVM_I2C_RESET() *
* *
* *
* *
******************************************************************************************************* *
Int16 DAVINCIEVM_I2C_RESET()
{
DAVINCIEVM_I2C_CLOSE ();
DAVINCIEVM_I2C_INIT();
返回0;
}
/*---------------------------------------------- *
* *
* DAVINCIEVM_I2C_WRITE( i2addr、data、len ) *
* *
* 主模式下的 I2C 写入 *
* *
* i2addr <- I2C 从器件地址 *
* data <- I2C data ptr *
* len <-要写入的字节数 *
* *
******************************************************************************************************* *
int16 DAVINCIEVM_I2C_write( uint16 i2caddr、uint8* data、uint16 len )
{
uint16 i;
Int32超时 = 0x20000;
Int32 TimeCount = 0;
#ifdef ARM_SIDE
uint16响应;
cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_DATA_COUNT、&len);
cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_SLAVE_ADDR、&i2cadr);
cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_DIR_transmit、0);
cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_start、0);
DAVINCIEVM_WAIT (10);
for (i = 0;i < len;i++)
{
cSL_i2cWrite (i2c_handle、&data[i]);
TimeCount = 0;
操作
{
cSL_i2cGetHwStatus (i2c_handle、cSL_I2C_query_TX_RDY、&Response);
TimeCount++;
如果(TimeCount >= timeout)
{
DAVINCIEVM_I2C_RESET();
退货1000;
}
} while (response =0);
}
//CSL_i2cHwControl (i2c_handle、CSL_I2C_CMD_stop、0);
返回0;
#Elif DSP_Side
I2C_ICCNT = len; //设置 len
I2C_ICSAR = i2addr; //设置 I2C 从器件地址
I2C_ICMDR = ICMDR_STT //配置主设备写入
| ICMDR_TRX
| ICMDR_MST
| ICMDR_IRS
| ICMDR_FREE
;
DAVINCIEVM_WAIT( 10); //短延迟
for (i = 0;i < len;i++)
{
I2C_ICDXR = DATA[i]; //写入
TimeCount = 0;
操作
{
TimeCount++;
如果(TimeCount >= timeout)
{
DAVINCIEVM_I2C_RESET();
退货1000;
}
} while ((I2C_ICSTR & ICSTR_ICXRDY)=0);//等待 Tx 就绪
}
I2C_ICMDR |= ICMDR_STP; //生成停止
返回0;
#endif
}
/*---------------------------------------------- *
* *
* DAVINCIEVM_I2C_READ( i2addr、data、len ) *
* *
* 主模式下的 I2C 读取 *
* *
* i2addr <- I2C 从器件地址 *
* data <- I2C data ptr *
* len <-要写入的字节数 *
* *
******************************************************************************************************* *
int16 DAVINCIEVM_I2C_READ( uint16 i2caddr、uint8* data、uint16 len )
{
uint16 i;
Int32超时 = 0x20000;
Int32 TimeCount = 0;
#ifdef ARM_SIDE
uint16响应;
cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_DATA_COUNT、&len);
cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_SLAVE_ADDR、&i2cadr);
cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_DIR_Receive、0);
cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_start、0);
DAVINCIEVM_WAIT (10);
for (i = 0;i < len;i++)
{
TimeCount = 0;
操作
{
cSL_i2cGetHwStatus (i2c_handle、cSL_I2C_query_RX_RDY、&Response);
TimeCount++;
如果(TimeCount >= timeout)
{
DAVINCIEVM_I2C_RESET();
退货1000;
}
} while (response =0);
cSL_i2cRead (i2c_handle,&data[i]);
}
//CSL_i2cHwControl (i2c_handle、CSL_I2C_CMD_stop、0);
返回0;
#Elif DSP_Side
I2C_ICCNT = len; //设置 len
I2C_ICSAR = i2addr; //设置 I2C 从器件地址
I2C_ICMDR = ICMDR_STT //配置为主器件读取
| ICMDR_MST
| ICMDR_IRS
| ICMDR_FREE
;
for (i = 0;i < len;i++)
{
TimeCount = 0;
操作
{
TimeCount++;
如果(TimeCount >= timeout)
{
DAVINCIEVM_I2C_RESET();
退货1000;
}
} while (( I2C_ICSTR & ICSTR_ICRDY )=0);//等待 Rx 就绪
DATA[i]= I2C_ICDRR; //读取
}
I2C_ICMDR |= ICMDR_STP; //生成停止
返回0;
#endif
}
/*---------------------------------------------- *
* *
* DAVINCIEVM_I2C_READ_variable (i2addr、data、len) *
* *
* 主模式下的 I2C 读取 *
* *
* i2addr <- I2C 从器件地址 *
* data <- I2C data ptr *
* len <-要写入的字节数 *
* *
******************************************************************************************************* *
int16 DAVINCIEVM_I2C_READ_variable (uint16 i2caddr、uint8* data、uint16 len)
{
uint16 i;
Int32超时 = 0x20000;
Int32 TimeCount = 0;
#ifdef ARM_SIDE
uint16响应;
cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_DATA_COUNT、&len);
cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_SLAVE_ADDR、&i2cadr);
cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_DIR_Receive、0);
cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_start、0);
DAVINCIEVM_WAIT (10);
for (i = 0;i < len;i++)
{
如果(i ==1)
{
len =数据[0];
cSL_i2cHwControl (i2c_handle、cSL_I2C_CMD_SET_DATA_COUNT、&len);
}
TimeCount = 0;
操作
{
cSL_i2cGetHwStatus (i2c_handle、cSL_I2C_query_RX_RDY、&Response);
TimeCount++;
如果(TimeCount >= timeout)
{
DAVINCIEVM_I2C_RESET();
退货1000;
}
} while (response =0);
cSL_i2cRead (i2c_handle,&data[i]);
}
//CSL_i2cHwControl (i2c_handle、CSL_I2C_CMD_stop、0);
返回0;
#Elif DSP_Side
I2C_ICCNT = len; //设置 len
I2C_ICSAR = i2addr; //设置 I2C 从器件地址
I2C_ICMDR = ICMDR_STT //配置为主器件读取
| ICMDR_MST
| ICMDR_IRS
| ICMDR_FREE
;
for (i = 0;i < len;i++)
{
如果(i ==1)
{
len =数据[0];
I2C_ICCNT = len; //设置 len
}
TimeCount = 0;
操作
{
TimeCount++;
如果(TimeCount >= timeout)
{
DAVINCIEVM_I2C_RESET();
退货1000;
}
} while (( I2C_ICSTR & ICSTR_ICRDY )=0);//等待 Rx 就绪
DATA[i]= I2C_ICDRR; //读取
}
I2C_ICMDR |= ICMDR_STP; //生成停止
返回0;
#endif
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
* Copyright 2005 by Spectrum Digital Incorporated。
* 保留所有权利。 Spectrum Digital Incorporated 的财产。
*
* 不可分发。
*
/*
* I2C 头文件
*
*
ifndef I2C_
#define I2C_
#include "davincievm.h"
#ifdef ARM_SIDE
#include "cSL_i2c.h"
静态 CSL_I2cHandle i2c_handle;
静态 CSL_I2cObj i2c_obj;
#Elif DSP_Side
#endif
/*---------------------------------------------- *
* *
* I2C 原型 *
* *
******************************************************************************************************* *
int16 DAVINCIEVM_I2C_init ();
int16 DAVINCIEVM_I2C_CLOSE ();
int16 DAVINCIEVM_I2C_WRITE( uint16 slaveaddr、uint8* data、uint16 len );
int16 DAVINCIEVM_I2C_READ ( uint16 slaveaddr、uint8* data、uint16 len );
#endif
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//在 include EX:csl_i2c.h 等中添加了更多与 I2C 相关的头文件