您好!
我已经运行了 TIvaware 文件夹中的 I2C 环回示例、并从中尝试设置通信
一个相当旧的罗盘传感器部件 HMC6352。
它可以与 Arduino sketch 配合使用、但无法与 TIvaware 配合使用。 这是我的代码。 我是否错过了或错误了什么?
此器件的从器件地址为0x42表示写入、0x43表示读取。 我认为这是对设置从地址函数中的 true 和 false 条件的处理。
该器件应在100kbps 模式下运行、但不确定在 driverlib I2C 中为什么设置了默认值。
//
// HMC6352.c
//*********
#include
#include
#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/sysctio.uarth"
#include "UART"
//
//
//要接收的 I2C 数据包数量。
////
*****************
#define NUM_I2C_DATA 2
//*********
//
//设置从机模块的地址。 这是以
//以下格式发送的7位地址:
// [A6:A5:A4:A3:A2:A1:A0:RS]
//
第一个字节的"RS"位置为零表示主
设备//向所选的从设备发送(发送)数据,而在该位置为1
表示主设备从设备接收数据。
////
*****************
#define SLAVE_ADDRESS 0x42
//*********
//
//此函数将 UART0设置为用于控制台,以便
在示例运行时显示信息//。
////
*****************
void
InitConsole (void)
{
//
//启用用于 UART0引脚的 GPIO 端口 A。
// TODO:将其更改为您正在使用的 GPIO 端口。
//
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
//
//为端口 A0和 A1上的 UART0功能配置引脚复用。
//如果您的器件不支持引脚复用、则无需执行此步骤。
// TODO:更改此选项以选择您正在使用的端口/引脚。
//
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
//
//启用 UART0以便我们可以配置时钟。
//
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
//
//使用内部16MHz 振荡器作为 UART 时钟源。
//
UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC);
//
//为这些引脚选择替代(UART)功能。
// TODO:更改此选项以选择您正在使用的端口/引脚。
//
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
//
//初始化控制台 I/O 的 UART
//
UARTStdioConfig (0、115200、16000000);
}
//*********
//
//配置 I2C0主机。
////
*****************
int
main (void)
{
#if defined (target_IS_TM4C129_RA0)|| \
已定义(TARGET_IS_TM4C129_RA1)|| \
已定义(TARGET_IS_TM4C129_RA2)
uint32_t ui32SysClock;
#endif
uint32_t pui32CmdTx;
uint32_t pui32DataRx[NUM_I2C_DATA];
uint32_t ui32Index;
//
//将时钟设置为直接从外部晶振/振荡器运行。
// TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值
板上的//晶体。
//
#if defined (target_IS_TM4C129_RA0)|| \
已定义(TARGET_IS_TM4C129_RA1)|| \
已定义(TARGET_IS_TM4C129_RA2)
ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_OSC)、25000000);
#else
SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHz);
#endif
//
//使用前必须启用 I2C0外设。
//
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
//
//对于本示例,I2C0与 PortB[3:2]一起使用。 实际端口和
//使用的引脚可能与您的器件不同、请参阅的数据表
//更多信息。 GPIO 端口 B 需要启用、因此这些引脚可以
//使用。
// TODO:将其更改为您正在使用的 GPIO 端口。
//
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
//
//为端口 B2和 B3上的 I2C0功能配置引脚复用。
//如果您的器件不支持引脚复用、则无需执行此步骤。
// TODO:更改此选项以选择您正在使用的端口/引脚。
//
GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);
//
//为这些引脚选择 I2C 功能。 此函数也会
//为 I2C 操作配置 GPIO 引脚,将其设置为
//开漏操作,弱上拉。 请参阅数据表
//查看每个引脚分配了哪些功能。
// TODO:更改此选项以选择您正在使用的端口/引脚。
//
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
//
//启用和初始化 I2C0主机模块。 使用的系统时钟
// I2C0模块。 最后一个参数设置 I2C 数据传输速率。
//如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率将设置为
//设置为400kbps。 在本示例中、我们将使用100kbps 的数据速率。
//
#if defined (target_IS_TM4C129_RA0)|| \
已定义(TARGET_IS_TM4C129_RA1)|| \
已定义(TARGET_IS_TM4C129_RA2)
I2CMasterInitExpClk (I2C0_BASE、ui32SysClock、false);
#else
I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、false);
#endif
//
//告诉主模块何时将在总线上放置什么地址
//与从设备通信。 将地址设置为 SLAVE_ADDRESS
//(在从机模块中设置)。 接收参数设置为 false
//表示 I2C 主设备正在向从设备发起写入操作。 如果
// true、这表示 I2C 主设备正在启动读取
//从器件。
//
I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、FALSE);
//
//设置用于显示消息的串行控制台。 这是
//仅用于此示例程序,I2C 操作不需要。
//
InitConsole();
//
//在控制台上显示示例设置。
//
UARTprintf ("标题->");
pui32CmdTx ='A';
//
//将要发送的数据放在数据寄存器中
//
I2CMasterDataPut (I2C0_BASE、pui32CmdTx);
//
//开始从主器件发送数据。
//
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
//
//等待从机接收并确认数据。
//
while (!(I2CSlaveStatus (I2C0_BASE)& I2C_SLAVE_ACT_RREQ))
{
}
//
//将数据方向修改为 true,以便查看地址
//表示 I2C 主设备正在从设备发起读取。
//
I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、TRUE);
for (ui32Index = 0;ui32Index < NUM_I2C_DATA; ui32Index++)
{
//
//指示主器件读取数据。
//
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive);
//
//等待从机完成发送数据。
//
while (!(I2CSlaveStatus (I2C0_BASE)& I2C_SLAVE_ACT_TREQ))
{
}
//
//从主设备读取数据。
//
pui32DataRx[ui32Index]= I2CMasterDataGet (I2C0_BASE);
//
//显示从机已接收到的数据。
//
UARTprintf ("'%c"、pui32DataRx[ui32Index]);
}
//UARTprintf ("\n");
}