Thread 中讨论的其他器件:controlSUITE
您好!
我尝试通过 I2C 总线向器件写入几条命令、我参考了 C:\ti\controlSUITE\device_support\f28m35x\v220\F28M35x_examples_Master\i2c_loopback 中的示例代码、并尝试对其进行编辑。 我在 SCL 线上看不到任何信号、代码卡在中
(I2CMasterBusy (I2C0_MASTER_BASE)
while 循环。
这是我使用的完整代码。
//###################################################################################################################### //文件:I2C_loopback.c //标题:演示简单 I2C 消息的示例 // 传输和接收。 //###################################################################################################################### //$TI 发行版:F28M35x 支持库 v220 $ //$发行 日期:星期二9月26日15:35:11 CDT 2017 $ //版权所有:(C) 2011-2017德州仪器(TI)公司- // http://www.ti.com/ 保留所有权利$ //############################################################################################################ #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "inc/hw_i2c.h" #include "inc/hw_NVIC.h" #include "driverlib/i2c.h" #include "driverlib/sysctl" #include "driverlib/udio.h"#include "driverlib/sysctl"#include "#include "driverlib.idio.h"#include "driverlib.state" #include "#include "#include "driverlib" // //! \addtogroup master_example_list //!I2C 主设备环回(i2c_master_slave_loopback)
//! //! 此示例说明了如何将 I2C0模块配置为环回模式。 //! 这包括设置主模块和从模块。 回送模式 //! 在内部将主从数据线和时钟线连接在一起。 //! 设置从机模块的地址、以便从 //! 主器件。 然后检查数据以确保接收到的数据与 //! 传输的数据。 此示例使用//的轮询方法 ! 发送和接收数据。 //! //! 此示例使用以下外设和 I/O 信号。 您必须 //! 查看这些内容并根据您自己的董事会需要进行更改: //! - I2C0外设 //! - GPIO 端口 B 外设(用于 I2C0引脚) //! - I2C0SCL - PB2 //! - I2C0SDA - PB3 //! //! 以下 UART 信号仅配置为显示控制台 //! 消息。 I2C 操作不需要这些。 //! - UART0外设 //! - GPIO 端口 E 外设(用于 UART0引脚) //! - UART0RX - PE4 //! - UART0TX - PE5 //! //! 此示例使用以下中断处理程序。 要使用此示例 //! 在您自己的应用程序中、您必须将这些中断处理程序添加到 您的//! 矢量表。 //! -无。 //// ***************** #ifdef _flash //这些由链接器定义(请参阅器件链接器命令文件) extern unsigned long RamfuncsLoadStart; extern unsigned long RamfuncsRunStart; extern unsigned long RamfuncsLoadSize; #endif //************* //要发送的 I2C 数据包数。 // #define NUM_I2C_DATA 3 //********* //设置从机模块的地址。 这是以 //以下格式发送的7位地址: // [A6:A5:A4:A3:A2:A1:A0:RS] //第一个字节的"RS"位置为零意味着主 设备//向所选的从设备发送(发送)数据,而在该位置为1 //意味着主设备接收来自从设备的数据。 // #define SLAVE_ADDRESS 0x27 //********* //此函数将 UART0设置为用于控制台显示信息 //示例正在运行。 // //void //InitConsole (void) //{ ////启用用于 UART0引脚的 GPIO 端口 A。 //// TODO:将其更改为使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE); // //配置端口 A0和 A1上 UART0功能的引脚复用。 ////如果您的器件不支持引脚复用、则不需要此步骤。 //// TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PE4_U0RX); // GPIOPinConfigure (GPIO_PE5_U0TX); // //选择这些引脚的替代(UART)功能。 //// TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeUART (GPIO_Porte _BASE、GPIO_PIN_4 | GPIO_PIN_5); // ////初始化控制台 I/O 的 UART // UARTStdioInit (0); //} //********* //配置 I2C0主机和从机,并使用环回模式连接它们。 // int main (void) { // unsigned long ulDataTx[NUM_I2C_DATA]; // unsigned long ulDataRx[NUM_I2C_DATA]; // unsigned long ulindex; //禁用保护 HWREG (SYSCTL_MWRALLOW)= 0xA5A5A5; //为75MHz - M3和150MHz - C28x 设置主时钟树 SysCtlClockConfigSet (SYSCTL_SYSDIV_1 | SYSCTL_M3SSDIV_2 | SYSCTL_USE_PLL | (SYSCTL_SPLLIMULT_M & 0x0F); #ifdef _FLASH //将时间关键代码和闪存设置代码复制到 RAM //其中包括以下函 数:InitFlash();// RamfuncsLoadStart、RamfuncsSize 和 RamfuncsRunStart //符号由链接器创建。 请参阅器件.cmd 文件。 memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize); //调用闪存初始化以设置闪存等待状态 //此函数必须驻留在 RAM 中 FlashInit(); #endif //使用前必须启用 I2C0外设。 SysCtlPeripheralEnable (SYSCTL_Periph_I2C0); //对于本示例,I2C0与 PortB[3:2]一起使用。 实际端口和 //使用的引脚可能与您的器件不同、请参阅的数据表 //更多信息。 GPIO 端口 B 需要启用、因此这些引脚可以 //使用。 // TODO:将其更改为您正在使用的 GPIO 端口。 SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); //为端口 B2和 B3上的 I2C0功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 GPIOPinConfigure (GPIO_PB6_I2C0SDA); GPIOPinConfigure (GPIO_PB7_I2C0SCL); //为这些引脚选择 I2C 功能。 此函数也会 //为 I2C 操作配置 GPIO 引脚,将其设置为 //开漏操作,弱上拉。 请参阅数据表 //查看每个引脚分配了哪些功能。 // TODO:更改此选项以选择您正在使用的端口/引脚。 GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_6 | GPIO_PIN_7); //启用环回模式。 环回模式是一个内置特性、 //////对于调试 I2C 操作很有用。 它在内部连接 I2C //主设备和从设备终端、这可以有效地让您以 ////主设备发送数据、以从设备接收数据。 ////注:对于外部 I2C 操作,您需要使用 比内部上拉强的外部上拉////。 有关 //////更多信息,请参阅数据表。 // HWREG (I2C0_MASTER_BASE + I2C_O_MCR)|= 0x01; I2CMasterEnable (I2C0_MASTER_BASE); //启用和初始化 I2C0主机模块。 使用的系统时钟 // I2C0模块。 最后一个参数设置 I2C 数据传输速率。 //如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率将设置为 //设置为400kbps。 在本示例中、我们将使用100kbps 的数据速率。 I2CMasterInitExpClk (I2C0_master_base、SysCtlClockGet ( System_Clock_speed)、false); ////启用 I2C0从机模块。 此模块仅用于测试 /////。 无需启用它即可使能/// I2Cx 主机模块正常运行。 // I2CSlaveEnable (I2C0_SLAVE_BASE); //将从器件地址设置为 SLAVE_ADDRESS。 在回送模式中、它是 一个/////任意7位数(在上面的宏中设置)、被发送到 //// I2CMasterSlaveAddrSet 函数。 // I2CSlaveInit (I2C0_SLAVE_BASE、SLAVE_ADDRESS); //告诉主模块何时将在总线上放置什么地址 //与从设备通信。 将地址设置为 SLAVE_ADDRESS //(在从机模块中设置)。 接收参数设置为 false //表示 I2C 主设备正在向从设备发起写入操作。 如果 // true、这表示 I2C 主设备正在启动读取 //从器件。 I2CMasterSlaveAddrSet (I2C0_MASTER_BASE、SLAVE_ADDRESS、FALSE); ////设置串行控制台以用于显示消息。 这只是 针对这个示例程序的////、而 I2C 操作不需要。 // InitConsole(); //在控制台上显示示例设置。 // UARTprintf ("I2C 环回示例->"); // UARTprintf ("\n 模块= I2C0"); // UARTprintf ("\n 模式=单发送/接收"); // UARTprintf ("\n 速率= 100kbp\n"n); //初始化要发送的数据。 // ulDataTx[0]='I'; // ulDataTx[1]='2'; // ulDataTx[2]='C'; SysCtlDelay (50000);//20ms 延迟 I2CMasterDataPut (I2C0_MASTER_BASE、0x30); I2CMasterControl (I2C0_MASTER_BASE、I2C_MASTER_CMD_SINGLE_SEND); //等待主机模块完成传输。 while (I2CMasterBusy (I2C0_MASTER_BASE)) { } ////初始化接收缓冲区。 // for (ulindex = 0;ulindex < NUM_I2C_DATA;ulindex++) //{ // ulDataRx[ulindex]= 0; //} // ////指示数据的方向。 // UARTprintf ("从主设备->从设备进行传输\n"); // ////////将3段 I2C 数据从主设备发送到从设备。 // for (ulindex = 0;ulindex < NUM_I2C_DATA;ulindex++) //{ // //显示 I2C0主机正在传输的数据。 // UARTprintf ("正在发送:'%c'。 。 。 "、ulDataTx[ulindex]); // // //将要发送的数据放在数据寄存器 中// I2CMasterDataPut (I2C0_MASTER_BASE、ulDataTx[ulindex]); // //开始从主器件发送数据。 因为回送 // //模式被启用、主控和受控单元被连接 // //允许我们接收我们发送的相同数据。 // I2CMasterControl (I2C0_MASTER_BASE、I2C_MASTER_CMD_SINGLE_SEND); // //等待从机接收并确认数据。 // while (!(I2CSlaveStatus (I2C0_SLAVE_BASE)& I2C_SCSR_RREQ) )// { //} // // //从从从器件读取数据。 // ulDataRx[ulindex]= I2CSlaveDataGet (I2C0_SLAVE_BASE); // //等待主机模块完成传输。 // while (I2CMasterBusy (I2C0_MASTER_BASE)) // { //} // // //显示从机已接收到的数据。 // UARTprintf ("已接收:'%c'\n"、ulDataRx[ulindex]); //} // ////////重置接收缓冲区。 // for (ulindex = 0;ulindex < NUM_I2C_DATA;ulindex++) //{ // ulDataRx[ulindex]= 0; //} // ////指示数据的方向。 // UARTprintf ("\n\n 从:从设备->主设备\n"进行传输); // ////////修改数据方向为 true,以便查看地址// ////指示 I2C 主设备正在从从设备发起读取。 // I2CMasterSlaveAddrSet (I2C0_master_base、slave_address、true); // ////执行虚拟接收以确保在第一次接收时不会收到垃圾。 // I2CMasterControl (I2C0_MASTER_BASE、I2C_MASTER_CMD_SINGLE_Receive); // ////虚拟确认并等待主机的接收请求。 ////完成此操作是为了清除不应设置的任何标志。 // while (!(I2CSlaveStatus (I2C0_SLAVE_BASE)& I2C_SLAVE_ACT_TREQ)) //{ //} // for (ulindex = 0;ulindex < NUM_I2C_DATA;ulindex++) // //显示 I2C0从机模块正在传输的数据。 // UARTprintf ("正在发送:'%c'。 。 。 "、ulDataTx[ulindex]); // // //将要发送的数据放在数据寄存器 中// I2CSlaveDataPut (I2C0_SLAVE_BASE、ulDataTx[ulindex]); // //告诉主设备读取数据。 // I2CMasterControl (I2C0_MASTER_BASE、I2C_MASTER_CMD_SINGLE_Receive); // //等待从机完成发送数据。 // while (!(I2CSlaveStatus (I2C0_SLAVE_BASE)& I2C_SLAVE_ACT_TREQ)) // { //} // // //从主设备读取数据。 // ulDataRx[ulindex]= I2CMasterDataGet (I2C0_MASTER_BASE); // //显示从机已接收到的数据。 // UARTprintf ("已接收:'%c'\n"、ulDataRx[ulindex]); //} // //////////////告知用户测试已完成。 // UARTprintf ("\nDone.\n\n"); // ////////返回无错误 while (1); // return (0); }
谢谢。