Other Parts Discussed in Thread: TM4C123GH6PM, EK-TM4C123GXL
Thread 中讨论的其他器件: EK-TM4C123GXL
工具/软件:Code Composer Studio
大家好、我正在尝试在2个 TM4C123GH6PM 之间对 I2C 进行编程、我使用了模块 I2C0和1K 上拉电阻器。 其理念是 UART 接收到的数据,然后触发 I2C 主设备向 I2C 从设备发送字符"R",接收和检测到"R"后从设备将返回主设备的数据。 数据已正确传输。 但有两个问题我自己无法解决。
- 当主机向从机发送数据时、 后面会有一个字符"y"(121)。 我想知道是否是帧 ACK、因为数据接收正确、ASCII 中的 ACK 值不同。
- 我只能读取一次数据。 之后,主程序卡在 while (!I2CMasterBusy ())中。 我不知道如何更改它。
主器件:
#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/interrupt.h"
#include "driverlib/pio.h"
#include "driverlib/pin_map.h"
#include "driverlib/i2c.h
、unsigned static truath
= 0xt_unsigned char v/inth、unsigned static trl 0b、inh、unsigned t_char v/int8、inc
、inuh、inc、inc、inc、inuh、unsigned static v/inth、inc 1、inc 1、inc、unsigned static v/inth、inc 1、t uc、t uc、inc、t uc、t uc、t uc、t uc
//清除 I2C0中断标志。
I2CMasterIntClear (I2C0_BASE);
//从从从器件读取数据。
DATA[j]= I2CMasterDataGet (I2C0_BASE);
I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、TRUE);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive);
J++;
if (j > 21)
{
J = 0;
}
}
静态空 UARTISR (空)
{
UARTIntClear (UART0_BASE、UARTIntStatus (UART0_BASE、TRUE));
while (UARTCharsAvail (UART0_BASE))
{
b[i]=UARTCharGetNonBlocking (UART0_BASE);
i++;
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1、GPIO_PIN_1);
SysCtlDelay (1000000);
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1、0);
SysCtlDelay (1000000);
};
I = 0;
if (B[i]='R')
{
I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、FALSE);
I2CMasterDataPut (I2C0_BASE、B[i]);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
while (I2CMasterBusy (I2C0_BASE));
I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、TRUE);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive);
// while (I2CMasterBusy (I2C0_BASE));//检查 MasterBusy 与 MasterBusy
}
}
int main (void)
{
X = 11.7;
ptr =(unsigned char *)&x;
a =* ptr;
b =*(ptr + 1);
C =*(ptr + 2);
D =*(ptr + 3);
//系统时钟设置
SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
//启用 UART 和 GPIO 外设
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1);
//为 UART0或 UART1 Tx 和 Rx 引脚启用相应的 GPIO 端口
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);//配置 UART0或 UART1 GPIO 引脚以进行 UART 操作
//将引脚设置为外设控制
UARTConfigSetExpClk (UART0_BASE、SysCtlClockGet ()、9600、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_LEen));
UARTIntEnable (UART0_BASE、UART_INT_RX|UART_INT_RT);
UARTEnable (UART0_BASE);
UARTIntRegister (UART0_BASE、UARTISR);
//启用包含 I2C 0的 GPIO 外设
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB));
//启用 I2C 模块0
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
//复位模块
SysCtlPeripheralReset (SYSCTL_Periph_I2C0);
//为端口 B2和 B3上的 I2C0功能配置引脚复用。
GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);
//为这些引脚选择 I2C 功能。
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
//启用和初始化 I2C0主机模块。 使用的系统时钟
// I2C0模块。 最后一个参数设置 I2C 数据传输速率。
//如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率将设置为
//设置为400kbps。
I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、false);
I2CMasterIntEnableEx (I2C0_BASE、I2C_MASTER_INT_DATA);
I2CIntRegister (I2C0_BASE、&I2C0MasterIntHandler);
while (1)
{
}
}
从属方:
#include
#include
#include "inc/hw_ints.h"
#include "inc/hw_i2c.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/itratl.h
#include "driverlib"#define "driver2ctrat_volature.h #define "#define "#define "#define "driverlib_unsignature.id_intrature.ide"#define "#define "#define "#define "#define "ine/driverlib"#define "driverlib_unsignature.id_ine.gpine.h"#define #define #define
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
SysCtlPeripheralReset (SYSCTL_Periph_I2C0);
GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
I2CSlaveEnable (I2C0_BASE);
I2CSlaveInit (I2C0_BASE、SLAVE_ADDRESS);
}
void I2C0SlaveIntHandler (void)
{
uint8_t i;
//清除 I2C0中断标志。
I2CSlaveIntClear (I2C0_BASE);
//从从从器件读取数据。
结果= I2CSlaveDataGet (I2C0_BASE);
if (结果='R')
{
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、0x02);
SysCtlDelay (SysCtlClockGet ()/50);
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、0);
SysCtlDelay (SysCtlClockGet ()/50);
对于(I = 0;I < 21;I++)
{
I2CSlaveDataPut (I2C0_BASE、DATA[i]);
SysCtlDelay (1200);
}
}
int main (void)
{
数据[0]='A';
uint8_t i;
对于(I = 0;I < 21;I++)
{
DATA[i]= DATA[0]+ I;
}
SysCtlClockSet (SYSCTL_SYSDIV_1| SYSCTL_USE_OSC| SYSCTL_OSC_MAIN| SYSCTL_XTAL_16MHz);
I2C0_Slave_Init();
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3);
I2CSlaveIntEnableEx (I2C0_BASE、I2C_SLAVE_INT_DATA);
I2CIntRegister (I2C0_BASE、I2C0SlaveIntHandler);
while (1)
{
}
}
谢谢你。