Thread 中讨论的其他器件:MSPM0G3507、 SysConfig
工具/软件:
您好、
我们是否可以将数据从一个 I2C 端口传输到同一控制器内的另一个 I2C 端口?
我要使用的 LaunchPad 是:MSPM0G3507
谢谢你
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.
工具/软件:
您好、
我们是否可以将数据从一个 I2C 端口传输到同一控制器内的另一个 I2C 端口?
我要使用的 LaunchPad 是:MSPM0G3507
谢谢你
您能否发布生成的(合并的)代码? 有时它所需要的是一个拼写错误。
------------------------
对于目标端, main () 的内容应该适合“target_init ()“函数,但以下情况除外:
DL_SYSCTL_enableSleepOnExit();
这一点应该删除、因为它对程序具有全局影响。 (它可能会产生您所看到的症状。)
while (1) {
__WFI();
}
应将其删除。 (我猜你已经做到了。)
感谢您的反馈。 我已根据你的建议对守则作了必要的调整。 我 随附了更新后的代码以供您查看。 您能否检查生成的(合并)代码?
#include <ti/driverlib/m0p/dl_interrupt.h>
#include "ti_msp_dl_config.h"
#define I2C_TX_PACKET_SIZE (8)
#define I2C_RX_PACKET_SIZE (5)
#define I2C_TX_MAX_PACKET_SIZE (16)
#define I2C_RX_MAX_PACKET_SIZE (16)
uint8_t gTxPacket[I2C_TX_PACKET_SIZE] = {
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
volatile uint8_t gRxPacket[I2C_RX_PACKET_SIZE];
uint32_t gTxLen, gTxCount;
/* Data sent to Controller in response to Read transfer */
uint8_t gTxPacket1[I2C_TX_MAX_PACKET_SIZE] = {0x00};
volatile uint8_t gRxPacket1[I2C_RX_MAX_PACKET_SIZE];
uint32_t gRxLen, gRxCount;
int main(void)
{
SYSCFG_DL_init();
gTxCount = 0;
gTxLen = I2C_TX_MAX_PACKET_SIZE;
DL_I2C_enableInterrupt(I2C_1_INST, DL_I2C_INTERRUPT_TARGET_TXFIFO_TRIGGER);
/* Initialize variables to receive data inside RX ISR */
gRxCount = 0;
gRxLen = I2C_RX_MAX_PACKET_SIZE;
DL_I2C_fillControllerTXFIFO(I2C_0_INST, &gTxPacket[0], I2C_TX_PACKET_SIZE);
/* Wait for I2C to be Idle */
while (!(
DL_I2C_getControllerStatus(I2C_0_INST) & DL_I2C_CONTROLLER_STATUS_IDLE))
;
DL_I2C_startControllerTransfer(I2C_0_INST, I2C_1_TARGET_OWN_ADDR,
DL_I2C_CONTROLLER_DIRECTION_TX, I2C_TX_PACKET_SIZE);
/* Poll until the Controller writes all bytes */
while (DL_I2C_getControllerStatus(I2C_0_INST) &
DL_I2C_CONTROLLER_STATUS_BUSY_BUS)
;
/* Trap if there was an error */
if (DL_I2C_getControllerStatus(I2C_0_INST) &
DL_I2C_CONTROLLER_STATUS_ERROR) {
/* LED will remain high if there is an error */
__BKPT(0);
}
/* Wait for I2C to be Idle */
while (!(
DL_I2C_getControllerStatus(I2C_0_INST) & DL_I2C_CONTROLLER_STATUS_IDLE))
;
/* Add delay between transfers */
delay_cycles(1000);
DL_I2C_startControllerTransfer(I2C_0_INST, I2C_1_TARGET_OWN_ADDR,
DL_I2C_CONTROLLER_DIRECTION_RX, I2C_RX_PACKET_SIZE);
for (uint8_t i = 0; i < I2C_RX_PACKET_SIZE; i++) {
while (DL_I2C_isControllerRXFIFOEmpty(I2C_0_INST));
gRxPacket[i] = DL_I2C_receiveControllerData(I2C_0_INST);
}
while (1) {
}
}
void I2C_1_INST_IRQHandler(void)
{
static bool dataRx = false;
switch (DL_I2C_getPendingInterrupt(I2C_1_INST)) {
case DL_I2C_IIDX_TARGET_START:
/* Initialize RX or TX after Start condition is received */
gTxCount = 0;
gRxCount = 0;
dataRx = false;
/* Flush TX FIFO to refill it */
DL_I2C_flushTargetTXFIFO(I2C_1_INST);
break;
case DL_I2C_IIDX_TARGET_RXFIFO_TRIGGER:
/* Store received data in buffer */
dataRx = true;
while (DL_I2C_isTargetRXFIFOEmpty(I2C_1_INST) != true) {
if (gRxCount < gRxLen) {
gRxPacket1[gRxCount++] = DL_I2C_receiveTargetData(I2C_1_INST);
} else {
/* Prevent overflow and just ignore data */
DL_I2C_receiveTargetData(I2C_1_INST);
}
}
break;
case DL_I2C_IIDX_TARGET_TXFIFO_TRIGGER:
/* Fill TX FIFO if there are more bytes to send */
if (gTxCount < gTxLen) {
gTxCount += DL_I2C_fillTargetTXFIFO(
I2C_1_INST, &gTxPacket1[gTxCount], (gTxLen - gTxCount));
} else {
while (DL_I2C_transmitTargetDataCheck(I2C_1_INST, 0x00) != false)
;
}
break;
case DL_I2C_IIDX_TARGET_STOP:
/* If data was received, echo to TX buffer */
if (dataRx == true) {
for (uint16_t i = 0;
(i < gRxCount) && (i < I2C_TX_MAX_PACKET_SIZE); i++) {
gTxPacket1[i] = gRxPacket1[i];
DL_I2C_flushTargetTXFIFO(I2C_1_INST);
}
dataRx = false;
}
break;
default:
break;
}
}> DL_I2C_enableInterrupt (I2C_1_INST、DL_I2C_INTERRUPT_TARGET_TXFIFO_TRIGGER);
之后、我认为您还需要(我猜是 IRQN 名称):
> NVIC_EnableIRQ (I2C_1_IRQN);//在 NVIC 中启用目标中断
-----
但这不会导致 NACK。 我想知道 ti_msp_dl_config.c 中的 I2C_1(目标)设置是否缺少对以下内容的调用:
> DL_I2C_setTargetOwnAddress (I2C_1_INST、I2C_1_TARGET_OWN_ADDR);
这是在示例中由 SysConfig 生成的、但也许它在合并中丢失了?
-----
更笼统地说、您似乎对两侧使用相同的 Tx/Tx Rx 缓冲区。 也许您已经检查过它是否正常工作、但乍一看似乎很危险。