您好!
我是一名学生,我尝试使用 I2C 在两个 Tiva 板之间进行通信。我有两个疑问,一个与带有中断的 i2c 通信有关,另一个与使用 i2c 的来回通信有关。
疑问1.
我正在进行与中断的 I2C 通信、它正在工作。
下面给出的代码。
#include "stdio.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "hw_memmap.h"
#include "inc/hw_ints.h"
#include "driverlib/pin_map.h"
#include "inc/hw_types.h"
#include "driverlib/interrupt.h"
#include "driverlib/SysTick .h"
#include "driverlib/timer.h"
#include "inc/hw_NVIC.h"
#include "driverlib/timer.c"
#include "driverlib/SysTick .c"
#include "driverlib/adc.h"
#include "driverlib/debug.h"
#include "driverlib/uart.h"
#include "driverlib/rom.h"
#include "inc/hw_ints.h"
#include "driverlib/ssi.h"
#include "driverlib/i2c.h"
#include "inc/hw_i2c.h"
空延迟(int a);
#define SLAVE_ADDRESS 0x20
int main()
{
SysCtlClockSet (SYSCTL_SYSDIV_1_SYSCTL_USE_OSC |SYSCTL_XTAL_8MHZ|SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C0));
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB));
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);
I2CMasterEnable (I2C0_BASE);
I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、false);
IntMasterEnable();
I2CMasterIntEnable (I2C0_BASE);
IntEnable (INT_I2C0);
while (1)
{
I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、FALSE);
I2CMasterDataPut (I2C0_BASE、0xBB);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
SysCtlDelay (1000);
}}
void I2C0_Handler (void){
uint32_t ui32Status;
ui32Status = I2CMasterIntStatus (I2C0_BASE、TRUE);//获取中断状态
I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、FALSE);
I2CMasterDataPut (I2C0_BASE、0xCC);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
//while (!I2CMasterBusy (I2C0_BASE));
I2CMasterIntClear (I2C0_BASE);//清除中断
}
我仅在主代码中使用中断。 我的疑问是 、如果我没有给出 while 循环内部或 while 循环外部突出显示的条件、那么中断处理程序函数也会执行。 如果我不使用这些命令、i2c 中断处理程序函数将不会执行、它将在 IntEnable (INT_I2C0)该命令中停止。 请告诉我发生这种情况的原因。 下面给出了从器件代码
从器件代码
#include "stdio.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "hw_memmap.h"
#include "inc/hw_ints.h"
#include "driverlib/pin_map.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/uart.h"
#include "inc/hw_ints.h"
#include "driverlib/i2c.h"
void InitConsole (void);
int main()
{
char 数据、char_rx、receive;
SysCtlClockSet (SYSCTL_SYSDIV_1_SYSCTL_USE_OSC|SYSCTL_XTAL_8MHZ|SYSCTL_OSC_MAIN);//将系统时钟设置为8MHz
InitConsole();
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C0));
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB));
//配置多路复用和 GPIO 设置、将 SSI 功能输出到引脚
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);
I2CSlaveAddressSet (I2C0_BASE、0、0x20);
I2CSlaveInit (I2C0_BASE、0x20);
I2CSlaveEnable (I2C0_BASE);
while (1) {
char_rx=I2CSlaveDataGet (I2C0_BASE);
while (!(I2CSlaveStatus (I2C0_BASE)& I2C_SLAVE_ACT_RREQ));
UARTCharPut (UART0_BASE、char_Rx);
}}
空 InitConsole (空)
{
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
while (!SysCtlPeripheralReady (SYSCTL_Periph_UART0));
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOA));
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
UARTConfigSetExpClk (UART0_BASE、SysCtlClockGet ()、9600、(UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE));
}
疑问2.
我想使用 i2c 在2个 Tiva 板之间来回发送数据、而不使用中断、我正在这样做。 我能够实现主机到从机的通信、但 AIM 是将相同的数据发送回主机并通过 UART 显示。 在串行监视器中、我得到了垃圾值。
代码如下所示
主器件代码
#define SLAVE_ADDRESS 0x20
void InitConsole (void);
字符数据;
int main()
{
SysCtlClockSet (SYSCTL_SYSDIV_1_SYSCTL_USE_OSC |SYSCTAL_XTAL_8MHZ|SYSCTL_OSC_MAIN);//将系统时钟设置为8MHz
InitConsole();
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C0));
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB));
//配置多路复用和 GPIO 设置、将 SSI 功能输出到引脚
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);
I2CMasterEnable (I2C0_BASE);
I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、false);
{
I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、FALSE);
I2CMasterDataPut (I2C0_BASE、0xBB);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、TRUE);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive);
Data= I2CMasterDataGet (I2C0_BASE);
while (I2CMasterBusy (I2C0_BASE));
UARTCharPut (UART0_BASE、DATA);
}}
空 InitConsole (空)
{
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
while (!SysCtlPeripheralReady (SYSCTL_Periph_UART0));
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOA));
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
UARTConfigSetExpClk (UART0_BASE、SysCtlClockGet ()、115200、(UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE));
}
从器件代码
int main()
{
char 数据、char_rx、receive;
SysCtlClockSet (SYSCTL_SYSDIV_1_SYSCTL_USE_OSC|SYSCTL_XTAL_8MHZ|SYSCTL_OSC_MAIN);
InitConsole();
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C0));
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB));
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);
I2CSlaveAddressSet (I2C0_BASE、0、0x20);
I2CSlaveInit (I2C0_BASE、0x20);
I2CSlaveEnable (I2C0_BASE);
while (1) {
char_rx=I2CSlaveDataGet (I2C0_BASE);
while (!(I2CSlaveStatus (I2C0_BASE)& I2C_SLAVE_ACT_RREQ));
I2CSlaveDataPut (I2C0_BASE、char_Rx);
}}
请告诉我问题是什么以及如何将其作为工作代码。 我是一名学生、在嵌入式 C 和 Tiva 方面也没有太多经验。 请帮帮我。 我希望有人能帮助我解决这些问题。
非常感谢您、
Mariya