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.

[参考译文] TM4C123GH6PM:[Tiva C LaunchPad] I2C 主器件可以#39;t 读取从器件发送的数据、在 I2CMasterBusy ()函数中存根

Guru**** 2526700 points
Other Parts Discussed in Thread: TM4C123GH6PM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/826811/tm4c123gh6pm-tiva-c-launchpad-i2c-master-can-t-read-data-sent-from-slave-stucks-in-i2cmasterbusy-function

器件型号:TM4C123GH6PM

大家好、

我在2个 Tiva-C launchpad 套件(TM4C123GH6PM)之间执行一些基本的 I2C 事务。 一个 Tiva LaunchPad 是主器件、另一个是从器件。 它们通过 I2C0模块相互连接、4.7K 上拉电阻器从 Launchpad 连接到3.3V。

我可以从主设备向从设备发送数据、从设备可以接收数据。 但是、当我将接收到的数据发送回主器件时、主器件无法读取它。 主软件进入 wihle (I2CMasterBusy()),因此它不能执行命令 I2CMasterDataGet ()。   

我阅读了一些与 我和 Amit Ashara 建议的问题相同的帖子(e2e.ti.com/.../378268)

将  wihle (I2CMasterBusy())替换为  

while (!(I2CMasterBusy (I2C0_BASE)));//等待事务结束
// SysCtlDelay (100);

while (I2CMasterBusy (I2C0_BASE));//等待事务结束。

但对我来说不是很好:(

以下是我的 TIVA 主设备代码、它卡在 while 循环中:

#include 
#include 
include "inc/tm4c123gh6m.h"
#include "inc/hw_ints.h"
#include "inc/hw_i2c.h"
#include "inc/hw_memmap.h"
#include "inc/hw_intru.idio"


#include "driverlib/interrupt.idio"

#include "driverlib.idio/intru.ide"#define








#define "ido/intru.ide"#define "ine.t.idio.ide"#define #include "idio.idio.idio.ide"#define #define #include "in/in.idive.t.ide"#define "in.in.in.in.ide"#define "in_ine.t.idive.t.idu.ide"#include "in.idu.idu.ide"#define #idu.idu.ide"#define "in.idu.idu.ide"#ide"



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);
}

void I2C0_Master_Init (void)
{
//为 I2C0启用 GPIO 引脚
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB));
//重置和启用 I2C 模块
SysCtlPeripheralDisable (SYSCTL_Periph_I2C0);
SysCtlPeripheralReset (SYSCTL_Periph_I2C0);
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);

// I2C 的配置引脚复用
GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);
//为这些引脚选择 I2C 功能
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);

//启用和初始化 I2C 主机模块
// flase:设置时钟400kHz
I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、false);

}

int main ()
{
uint32_t ui32DataTx;

SysCtlClockSet (SYSCTL_SYSDIV_1| SYSCTL_USE_OSC| SYSCTL_OSC_MAIN| SYSCTL_XTAL_16MHz);
InitConsole();
I2C0_Master_Init();
// Enale I2C 主块
I2CMasterEnable (I2C0_BASE);
//中断配置从从器件接收数据

UARTprintf ("I2C 主设备发送数据示例->");
UARTprintf ("\n 模块= I2C0");
UARTprintf ("\n 模式=从机模块上的接收中断");
UARTprintf ("\n 速率= 100kbps\n");\
while (1)
{
/* 准备发送数据以便主设备将数据发送到从属设备*/

ui32DataTx = UARTCharGet (UART0_BASE);
UARTprintf ("正在从主设备->从设备进行传输\n");
UARTprintf ("正在发送:'%c'\n"、ui32DataTx);
// 选择 SLAVE_ADDRESS 进行传输
I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、FALSE);
// 将数据放入 I2C 数据寄存器
I2CMasterDataPut (I2C0_BASE、ui32DataTx);
// 启动 SNED 数据字符
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
// 延迟、直到传输完成
while (I2CMasterBusy (I2C0_BASE));

/* 准备从 salve*/接收数据
UARTprintf ("再次准备接收数据\n");
I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、TRUE);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive);
SysCtlDelay (100);
//=>>> 代码卡在这里 
while (I2CMasterBusy (I2C0_BASE));//等待事务结束 ui32DataTx = I2CMasterDataGet (I2C0_BASE); UARTprintf ("再次接收数据:%d\n"、ui32DataTx); } }

这是我的从代码、在它恢复后、它将发送回主代码

#include 
#include 
#include "inc/hw_i2c.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"

#include "driverlib/gpio.h"
#include "driverlib/i2c.h"
#include "driverlib/utilidio.ide"






#include "drivers/intrateg.potr.ide"#define "udio.idio.ide"#include "uart/unt


static status.idio.ide"#include "uart/intru.idio.idio.ide"#include "u.idio.ide"#include "u.32r.tru.tru.tru.tru.tru.ide"#include "u.tru.tru.tru.ide"#include "u.tru.tru.tru.idu.



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);
}

void I2C0_Init (void)
{
//启用 GPIO_PORTB
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB));

SysCtlPeripheralDisable (SYSCTL_Periph_I2C0);
SysCtlPeripheralReset (SYSCTL_Periph_I2C0);
C0SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);

GPSCIP2TPL_Configure)
GPIOPinConfigure (GPIO_PB3_I2C0SDA);
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);

}

int main (void)
{
SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHz);
I2C0_Init();
// Init 从器件
I2CSlaveInit (I2C0_BASE、SLAVE_ADDRESS);
//启用 I2C 从机模块
I2CSlaveEnable (I2C0_BASE);
InitConsole();
UARTprintf ("从器件等待 I2C 数据\n");

uint32_t i2cMasterData;

while (1)
{
// 从主机接收数据
while (!(I2CSlaveStatus (I2C0_BASE)& I2C_SLAVE_ACT_RREQ))
{

}
i2cMasterData = I2CSlaveDataGet (I2C0_BASE);
UARTprintf ("从主设备接收的数据:%c\n"、i2cMasterData);
// 再次将数据发送到主设备
I2CSlaveDataPut (I2C0_BASE、i2cMasterData); 
SysCtlDelay (100); UARTprintf ("再次向主设备发送数据:%c\n"、i2cMasterData); } }