主题中讨论的其他器件: TMP117
这 是九个月前在后火炉上放置的前一个线程的延续、我最终将再次查看。 我的系统使用 MSP432E401Y 通过 SPI 和 UART 接口控制和读取多个不同器件的数据。 我当前在 CPU 控制下从 SPI 器件读取数据、但 UART 速度很慢、在传输过程中无法承受 CPU 延迟、因此我使用 uDMA 将数据从传感器移动到内部存储器。
我需要在系统中添加一个温度传感器、我正在考虑使用具有 I2C 接口的 TMP117。 我购买了 TMP117 EVM、并将其用蓝色线连接到我的 MSP432板上以进行测试和代码开发。 I2C 总线也太慢、无法通过 CPU 执行传输、因此我也想使用 uDMA。 我创建了一个非常简单的项目、目标是采取婴儿措施、以获得功能齐全的解决方案。 以下是 main()例程的代码:
#include <ti/devices/msp432e4/driverlib/driverlib.h>
#include "common.h"
void main(void)
{
uint32_t g_ui32SysClock; // The system clock frequency
int32_t status;
tempReady = false;
g_ui32SysClock = init_CLK(); // configure system clock
init_GPIO(); // configure the device pins
int_disable();
status = init_temp_I2C(g_ui32SysClock); // configure temperature sensor I2C interface
status = init_temperature(); // initialize temperature driver parameters
// the code below is used to transfer data from the TMP117 under CPU control
// int_enable();
//
// while(1){
// while(!tempReady);
// tempReady = false;
// }
// end of CPU control
// the code below is used to transfer data from the TMP117 under uDMA control
ConfigureuDMATX();
MAP_uDMAChannelRequest(UDMA_CH23_I2C5TX);
// end of uDMA control
}
我的第一步 是使用 CPU 写入配置和读取/写入函数。 首先,init_temp_I2C()函数启用 I2C 外设,然后 init_temperatures ()配置 TMP117并开始数据采集。 当 TEMP_DRDY 中断触发 tempReadyFxn() ISR 读取数据时。 最后, 当 I2C 传输完成时,tempCallBack()回调会设置 tempReady 信标。 使用此代码、我可以成功地从 TMP117捕获数据。
下一步是在 I2C、TMP117和 UDMA 由 CPU 初始化后使用 UDMA 来捕获数据。 我使用 了 Resource Explorer 中的 i2c_master_dma_fifo 和 i2c_mastermode_fifodma_transfer 示例作为指南。
下面的图表解释了 TMP117的数据传输协议:

当主器件(MSP432)驱动 SDA 线路时、灰色框显示;当 TMP117驱动线路时、白色框显示。
我的数据传输比显示的要简单、因为我始终从相同的寄存器地址读取数据、每次传输都不需要发送寄存器地址。 相反、MSP432只需要通过 SDA 发送一个字节、然后 TMP117将使用两个字节进行回复。 因为传输的数据太少、我认为我不需要使用 FIFO。 TMP117以500ms 的速率进行采样、但 MSP432仅以1S 的速率记录温度数据、因此我不介意我是否覆盖尚未记录的数据。
随附的项目文件显示了我的测试的当前状态。 在这个非常简单的代码中、我使用 init_temp_I2C()和 init_temperated() 来初始化 I2C 外设和 TMP117。 接下来、我将尝试启用和配置 UDMA 外设、并从 I2C 总线发送一个字节。 函数 ConfigureuDMATX()的目的是将 uDMA 通道23映射 到 I2C5,并将 单个字节的转码器从 sendMasterTxData 指向的内存初始化为 I2C5主数据寄存器,然后我希望该数据寄存器在 I2C5SDA 上传输。
void ConfigureuDMATX(void)
{
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
while(!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_UDMA))){}
MAP_uDMAEnable();
MAP_uDMAControlBaseSet(pui8ControlTable);
MAP_uDMAChannelAssign(UDMA_CH23_I2C5TX);
MAP_uDMAChannelAttributeDisable(UDMA_CH23_I2C5TX, UDMA_ATTR_USEBURST |
UDMA_ATTR_ALTSELECT |
UDMA_ATTR_HIGH_PRIORITY |
UDMA_ATTR_REQMASK);
MAP_uDMAChannelControlSet(UDMA_CH23_I2C5TX | UDMA_PRI_SELECT,
UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_NONE |
UDMA_ARB_1);
MAP_uDMAChannelTransferSet(UDMA_CH23_I2C5TX | UDMA_PRI_SELECT,
UDMA_MODE_AUTO, (void *)&sendMasterTxData,
(void *)&I2C5->MDR, 1);
MAP_uDMAChannelEnable(UDMA_CH23_I2C5TX);
}
最后、我调用 map_uDMAChannelRequest (UDMA_CH23_I2C5TX)来执行传输。
很遗憾, 在执行 MAP_uDMAChannelRequest()后,我看不到 I2C 总线上的传输。
如果能帮助您解决这个问题、我将不胜感激。 我不知道我是否错误地配置了 UDMA、或者错过了一些关键的初始化 Conde。
谢谢、
-Phil



