#include <stdbool.h>
#include <stdint.h>
#include "inc/hw_i2c.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/i2c.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
// 宏定义要发送的字节
#define NUM_I2C_DATA 3
//宏定义从机地址
#define SLAVE_ADDRESS 0x3C
//串口初始化配置函数
void Initconsole(void)
{
//使能用于UART的端口A
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
//配置PA0为UART8的接收端,PA1为接收端
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
//使能UARTO外设
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
//使用内部16MHz振荡器作为UART时钟源
UARTClockSourceSet(UART0_BASE,UART_CLOCK_PIOSC);
//选择端口A的pin0和pin1为UART复用功能
GPIOPinTypeUART(GPIO_PORTA_BASE , GPIO_PIN_0 | GPIO_PIN_1);
//初始化 UART
UARTStdioConfig(0 , 115200, 16000000);
}
int main(void)
{
uint32_t uint32SysClock;
//发送数据缓存区
uint32_t puint32DataTx[NUM_I2C_DATA];
//接收数据缓存区
uint32_t puint32DataRx[NUM_I2C_DATA];
//要发送的数据在缓存区的位置
uint32_t uint32Index;
//设置系统时钟频率为25MHz
uint32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_OSC), 25000000);
// 使能I2C0外设
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
//使能用于I2C的端口B
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
//配置端口B的pin2位I2CSCL,pin3为I2CSDL
GPIOPinConfigure(GPIO_PB2_I2C0SCL);
GPIOPinConfigure(GPIO_PB3_I2C0SDA);
//选择端口B的pin2和pin3为I2C复用功能
GPIOPinTypeI2CSCL(GPIO_PORTB_BASE,GPIO_PIN_2);
GPIOPinTypeI2C(GPIO_PORTB_BASE,GPIO_PIN_3);
//使能回送模式
HWREG(I2C0_BASE + I2C_O_MCR) |= 0x01;
//初始化I2C0的主机模块,I2C0模块的时钟频率大小为系统时钟频率,
//主机传输速率为100Kbps
I2CMasterInitExpClk(I2C0_BASE, uint32SysClock, false);
//使能从机模块
I2CSlaveEnable(I2C0_BASE);
//设置从机地址
I2CSlaveInit(I2C0_BASE , SLAVE_ADDRESS);
//设置主机放到总线上的地址,选择从机,传输方式是主机发送数据到从机
I2CMasterSlaveAddrSet(I2C0_BASE , SLAVE_ADDRESS , false);
//调用串口初始化及配置函数
Initconsole();
//串口控制台显示的数据
UARTprintf("I2c Loopback Example ->");
UARTprintf("\n Module = I2C0");
UARTprintf("\n Mode = Single Send/Receive");
UARTprintf("\n Rate = 100kbps\n\n");
//初始化要发送的数据
puint32DataTx[0] = 'I';
puint32DataTx[1] = '2';
puint32DataTx[2] = 'C';
//初始化接收缓存区
for(uint32Index = 0 ; uint32Index < NUM_I2C_DATA ; uint32Index++)
{
puint32DataRx[uint32Index] = 0;
}
//显示数据传送方向
UARTprintf("Tranferring from: Master ->slave'n");
//主机发送三个数据
for(uint32Index = 0 ; uint32Index < NUM_I2C_DATA; uint32Index++)
{
//显示I2C正在传送的数据
UARTprintf( " Sending: '%c' . . . ", puint32DataTx[uint32Index]);
//将要发送的数据放到主机数据寄存器中
I2CMasterDataPut(I2C0_BASE,puint32DataTx[uint32Index]);
//配置I2C主机为单端发送
I2CMasterControl(I2C0_BASE , I2C_MASTER_CMD_SINGLE_SEND);
//等待从机接收数据并确认
while(!(I2CSlaveStatus(I2C0_BASE) & I2C_SLAVE_ACT_RREQ))
{
}
//从从机数据寄存器读取数据
puint32DataRx[uint32Index] = I2CSlaveDataGet(I2C0_BASE);
//等待主机传输完毕
while(I2CMasterBusy(I2C0_BASE))
{
}
//显示从机接收的数据
UARTprintf( "Received:'%c'\n",puint32DataRx[uint32Index]);
}
//重置接收缓冲区
for(uint32Index = 0 ;uint32Index < NUM_I2C_DATA ; uint32Index++)
puint32DataRx[uint32Index]=0;
//显示数据传输方向
UARTprintf("\n\nTranferring from: slave -> Master\n");
//设置主机放到总线上的地址,选择从机,传输方式是主机从从机接收数据
I2CMasterSlaveAddrSet(I2C0_BASE , SLAVE_ADDRESS , true);
//配置I2C主机为单端接收
I2CMasterControl(I2C0_BASE , I2C_MASTER_CMD_SINGLE_RECEIVE);
//等待主机请求从机发送数据
while(!(I2CSlaveStatus(I2C0_BASE) & I2C_SLAVE_ACT_TREQ))
{
}
for(uint32Index=0 ; uint32Index < NUM_I2C_DATA ; uint32Index++)
{
//显示从机正在发送的数据
UARTprintf(" Sending:'%C' . . . " , puint32DataTx[uint32Index]);
//将要发送的数据放到从机数据寄存器
I2CSlaveDataPut(I2C0_BASE,puint32DataTx[uint32Index]);
//通知主机接收数据
I2CMasterControl(I2C0_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
//等待从机模块发送完毕
while(!(I2CSlaveStatus(I2C0_BASE) & I2C_SLAVE_ACT_TREQ))
{
}
//从主机数据寄存器读取数据
puint32DataRx[uint32Index]=I2CMasterDataGet(I2C0_BASE);
//显示接收的数据
UARTprintf("Received:'%c'\n" , puint32DataRx[uint32Index]);
}
//显示测试已完成
UARTprintf("\nDone.\n\n");
//返回
return 0;
}
代码编译之后的报错如下图:
程序路径里面有未识别到的UART相关的两个函数的.c和.h文件
但是编译之后没有Binaries和其中的.out文件