This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28379D:使用 bmp280传感器,不接收和导出数据,无法从示波器读取任何信号。

Guru**** 2611705 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1108135/tms320f28379d-using-bmp280-sensor-not-receiving-and-exporting-data-cannot-reading-any-signal-from-oscilloscope

器件型号:TMS320F28379D
//
//包含的文件
//
#include "F28x_Project.h"

//
//定义函数

void I2CA_Init (void);
uint16 I2CA_ReadData (uint16 reg_r);
uint16 I2CA_WriteData (uint16 reg_t、uint16 reg_t 数据);
//

/uint16 (







void)/uint16 reg_int1;/uint16 influint16




(inuint1)/uint1、inuint1、inuint16和 uint1、inuint1、inuint1、inuint16和 uint1、inuint1、/uint1 初始化系统控制:
// PLL、看门狗、启用外设时钟
//此示例函数位于 F2837xD_sysctrl.c 文件中。
//
InitSysCtrl();
//
//步骤2。 初始化 GPIO:
//此示例函数位于 F2837xD_GPIO.c 文件中,
//说明了如何将 GPIO 设置为其默认状态。
//
InitGpio();

//
对于这个示例、只初始化 SCI-A 端口的引脚。
//这些函数可在 F2837xD_GPIO.c 文件中找到。
//
EALLOW;

GPIO_SetupPinMux (104、GPIO_MUX_CPU1、1);
GPIO_SetupPinMux (105、GPIO_MUX_CPU1、1);


//
//步骤3。 清除所有__interrupts 并初始化 PIE 矢量表:
//禁用 CPU __interrupts
//
Dint;

//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态是禁用所有 PIE _interrupts 并
清除标志//。
//此函数位于 F2837xD_PIECTRL.c 文件中。
//
InitPieCtrl();

//
禁用 CPU __interrupts 并清除所有 CPU __interrupt 标志:
//
IER = 0x0000;
IFR = 0x0000;

//
//初始化 PIE 矢量表,其中包含指向 shell 中断
//服务例程(ISR)的指针。
//这将填充整个表,即使在
本示例中未使用__interrupt //也是如此。 这对于调试很有用。
//可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2837xD_PieVect.c 中找到
//
InitPieVectTable();
I2CA_Init();

//
for (;;)
{
I2CA_WriteData (0xE7、0xB6);
DELAY_US (100);
I2CA_ReadData (0xD0);
DELAY_US (100);
}

}

//********* //
void I2CA_Init (void)
{
/*
//初始化 I2C
I2caRegs.I2CMDR.ALL = 0x0000;
I2caRegs.I2CSAR.ALL = 0x76; //从器件地址

I2caRegs.I2CPSC.all = 8; //预分频器-模块时钟需要7-12MHz
I2caRegs.I2CCLKL = 10; //注:必须为非零
I2caRegs.I2CCLKH=5; //注:必须为非零

//I2caRegs.I2CIER.ALL = 0x24; //启用 SCD 和 ARDY 中断0010 0100
I2caRegs.I2CIER.bit.AAS = 0; //寻址为从机中断使能位
I2caRegs.I2CIER.bit.SCD=1; //检测到停止条件中断使能位
I2caRegs.I2CIER.bit.XRDY=1; //发送数据就绪中断使能位
I2caRegs.I2CIER.bit.XRDY=1; //接收数据就绪中断使能位
I2caRegs.I2CIER.bit.ARDY = 1; //寄存器访问就绪中断使能位
I2caRegs.I2CIER.bit.nack = 0; //无确认中断使能位
I2caRegs.I2CIER.bit.ARBL = 0; //仲裁丢失中断使能位

//I2caRegs.I2CMDR.ALL = 0x0020; //使 I2C 退出复位,挂起时停止 I2C
I2caRegs.I2CMDR.bit.NACKMOD = 0; // NACK 模式位
I2caRegs.I2CMDR.bit.FREE = 0; //挂起时停止 I2C
I2caRegs.I2CMDR.bit.STT = 0; //起始条件位
I2caRegs.I2CMDR.bit.STP= 0; //停止条件位
I2caRegs.I2CMDR.bit.MST = 0; //从机模式
I2caRegs.I2CMDR.bit.TRX = 0; //接收器模式
I2caRegs.I2CMDR.bit.XA = 0; // 7位寻址模式
I2caRegs.I2CMDR.bit.RM = 0; //非重复模式
I2caRegs.I2CMDR.bit.DLB = 0; //数字回送模式被禁用
I2caRegs.I2CMDR.bit.IRS = 1; //启用 I2C 模块
I2caRegs.I2CMDR.bit.STB = 0; // I2C 模块不处于起始字节模式
I2caRegs.I2CMDR.bit.FDF = 0; //禁用自由数据格式模式
I2caRegs.I2CMDR.bit.BC = 0; //每个数据字节8位

//未使用 FIFO

返回;

*


I2caRegs.I2CSAR.ALL = 0x0076; //从机地址—EEPROM 控制代码

I2caRegs.I2CPSC.all = 16; //预分频器-模块时钟需要7-12MHz
I2caRegs.I2CCLKL = 10; //注:必须为非零
I2caRegs.I2CCLKH=5; //注:必须为非零
I2caRegs.I2CIER.ALL = 0x24; //启用 SCD 和 ARDY __interrupts

I2caRegs.I2CMDR.ALL = 0x0020; //使 I2C 退出复位
//挂起时停止 I2C

I2caRegs.I2CFFTX.ALL = 0x6000;//启用 FIFO 模式和 TXFIFO
I2caRegs.I2CFFRX.ALL = 0x2040;//启用 RXFIFO、清除 RXFFINT


、}

uint16 I2CA_WriteData (uint16 reg_t、uint16 data)
{
I2caRegs.I2CMDR.bit.IRS = 1; //复位 I2C


//确保 I2C 不忙且已停止
while (I2cRegs.I2CSTR.bit.BB = 1); //忙循环
I2caRegs.I2CSTR.bit.SCD = 1; //清除 SCD 位(停止条件位)
while (I2caRegs.I2CMDR.bit.STP==1); //停止位循环

I2caRegs.I2CSAR.ALL = 0x76; // I2C 从地址
//while (I2cRegs.I2CSTR.bit.BB = 1); //仍然忙?

I2caRegs.I2CCNT = 2; //假设寄存器地址= 1字节,数据为1字节

//I2caRegs.I2CMDR.ALL = 0x6E20; //开始,停止,无 rm,重置 i2c 01101110 00100000
I2caRegs.I2CMDR.bit.NACKMOD = 0; // NACK 模式位
I2caRegs.I2CMDR.bit.FREE = 1; //挂起时运行空闲 I2C
I2caRegs.I2CMDR.bit.STT = 1; //起始条件位
I2caRegs.I2CMDR.bit.STP= 1; //停止条件位
I2caRegs.I2CMDR.bit.MST = 1; //主模式
I2caRegs.I2CMDR.bit.TRX = 1; //发送器模式
I2caRegs.I2CMDR.bit.XA = 0; // 7位寻址模式
I2caRegs.I2CMDR.bit.RM = 0; //非重复模式
I2caRegs.I2CMDR.bit.DLB = 0; //数字回送模式被禁用
I2caRegs.I2CMDR.bit.IRS = 1; //启用 I2C 模块
I2caRegs.I2CMDR.bit.STB = 0; // I2C 模块不处于起始字节模式
I2caRegs.I2CMDR.bit.FDF = 0; //禁用自由数据格式模式
I2caRegs.I2CMDR.bit.BC = 0; //每个数据字节8位

while (I2cRegs.I2CSTR.bit.XRDY = 0); //在巴士免费前什么也不做

I2caRegs.I2CDXR.all = reg_t; //传感器的寄存器地址(1个字节)
I2caRegs.I2CDXR.All =数据;


I2caRegs.I2CMDR.bit.STP= 1; // CNT=0时停止位

while (!I2cRegs.I2CSTR.bit.SCD); //等待停止条件

返回(1);
}

uint16 I2CA_ReadData (uint16 reg_r)
{


I2caRegs.I2CMDR.bit.IRS = 1; //复位 I2C

//确保 I2C 不忙且已停止
while (I2cRegs.I2CSTR.bit.BB = 1); //忙循环
I2caRegs.I2CSTR.bit.SCD = 1; //清除 SCD 位(停止条件位)
while (I2caRegs.I2CMDR.bit.STP==1); //停止位循环

I2caRegs.I2CSAR.ALL = 0x76; // I2C 从器件地址

// while (I2cRegs.I2CSTR.bit.BB = 1); //仍然忙?

//I2caRegs.I2CMDR.ALL = 0x2620; //开始、无停止位、主器件、TX、复位 I2C 00100110
I2caRegs.I2CMDR.bit.NACKMOD = 0; // NACK 模式位
I2caRegs.I2CMDR.bit.FREE = 0; //挂起时停止 I2C
I2caRegs.I2CMDR.bit.STT = 1; //起始条件位
I2caRegs.I2CMDR.bit.STP= 0; //停止条件位
I2caRegs.I2CMDR.bit.MST = 1; //主模式
I2caRegs.I2CMDR.bit.TRX = 1; //发送器模式
I2caRegs.I2CMDR.bit.XA = 0; // 7位寻址模式
I2caRegs.I2CMDR.bit.RM = 0; //非重复模式
I2caRegs.I2CMDR.bit.DLB = 0; //数字回送模式被禁用
I2caRegs.I2CMDR.bit.IRS = 1; //启用 I2C 模块
I2caRegs.I2CMDR.bit.STB = 0; // I2C 模块不处于起始字节模式
I2caRegs.I2CMDR.bit.FDF = 0; //禁用自由数据格式模式
I2caRegs.I2CMDR.bit.BC = 0; //每个数据字节8位

I2caRegs.I2CCNT = 1; //假设寄存器地址为一个字节

while (I2cRegs.I2CSTR.bit.XRDY = 0); //在巴士免费前什么也不做
I2caRegs.I2CDXR.ALL = 0xD0; //传感器的寄存器地址(1个字节)

while (!I2cRegs.I2CSTR.bit.ARDY); //准备好了吗?
//I2caRegs.I2CMDR.ALL = 0x2C20; //开始、CNT = 0时的停止位、主器件、Rx、复位 I2C 00101100
I2caRegs.I2CMDR.bit.NACKMOD = 0; // NACK 模式位
I2caRegs.I2CMDR.bit.FREE = 0; //挂起时停止 I2C
I2caRegs.I2CMDR.bit.STT = 1; //起始条件位
I2caRegs.I2CMDR.bit.STP= 1; //停止条件位
I2caRegs.I2CMDR.bit.MST = 1; //主模式
I2caRegs.I2CMDR.bit.TRX = 0; //接收器模式
I2caRegs.I2CMDR.bit.XA = 0; // 7位寻址模式
I2caRegs.I2CMDR.bit.RM = 0; //非重复模式
I2caRegs.I2CMDR.bit.DLB = 0; //数字回送模式被禁用
I2caRegs.I2CMDR.bit.IRS = 1; //启用 I2C 模块
I2caRegs.I2CMDR.bit.STB = 0; // I2C 模块不处于起始字节模式
I2caRegs.I2CMDR.bit.FDF = 0; //禁用自由数据格式模式
I2caRegs.I2CMDR.bit.BC = 0; //每个数据字节8位

I2caRegs.I2CCNT = 1; //只读取一个字节数据

if (I2cRegs.I2CSTR.bit.nack = 1)
{
I2caRegs.I2CSTR.All = I2C_CLR_Nack_bit;// 0x0002
}
I2caRegs.I2CMDR.bit.STP= 1; // CNT=0时停止位

while (!I2cRegs.I2CSTR.bit.SCD); //是否检测到停止位?
ID = I2caRegs.I2CDRR.All; //读取一个字节数据

返回(1);
} 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    您能否提供您所看到问题的更多详细信息?  

    从代码中、很难确定您观察到的确切问题。

    此致

    Siddharth

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我无法运行 i2c 协议、SCL 输出始终看起来很高(3.3V)。 GPIO 设置不能正常工作。

    此致、

    InitGpio();

    //
    //对于这个示例、只初始化针对 SCI-A 端口的引脚。
    //这些函数可在 F2837xD_GPIO.c 文件中找到。
    //
    GPIO_SetupPinMux (104、GPIO_MUX_CPU1、1);
    GPIO_SetupPinMux (105、GPIO_MUX_CPU1、1);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    您能否监控 I2C 引脚?    执行写操作时、您是否能够在 SCL 和 SDA 引脚上看到时钟和从器件地址?

    I2C 的状态寄存器是什么?

    此致

    Siddharth