主题中讨论的其他器件:C2000WARE、 CC3220SF-LAUNCHXL、 CC3220SF、 TMS320F28379D
我正在尝试弄清楚如何对数据传输进行编程。 Resource Explorer 中的给定示例无法让我继续。
请帮我提供一些资源或其他类似示例、以帮助我了解如何对其进行编程。
谢谢你。
Varunkumar
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我正在尝试弄清楚如何对数据传输进行编程。 Resource Explorer 中的给定示例无法让我继续。
请帮我提供一些资源或其他类似示例、以帮助我了解如何对其进行编程。
谢谢你。
Varunkumar
瓦伦
如果您要开始使用 F28379D、我建议您使用网上商店培训材料、其中包括实验室练习和示例项目。 它通过示例代码很好地概述了此器件及其外设的各种特性。
完成实验课程材料后、您应该能够执行以下步骤以使用示例代码。
步骤1:了解以下 SPI 示例代码并观察 SPI 信号。
使用以下项目并修改所使用的 SPIA GPIO、如下所示。 编译代码并运行代码
项目: \device_support\f2837xd\examples\cpu1\spi_loopback\cpu01
此示例代码将 SPIA 配置为主器件、并在启用内部回路时独立运行。 您无需进行任何外部硬件连接。
步骤2:完全了解此代码后、您可以修改此代码以与 CC3220SF-LAUNCHXL 进行通信。
希望这对您有所帮助。 祝您好运、欢迎来到 C2000!!!
快乐编程!
此致、
曼诺伊
嗨、Manoj!
感谢您的回复、继续我的项目非常有帮助。 遗憾的是、我在提出问题时出错了。 我实际上在使用
F28379D 控制卡和 R4.1控制卡集线站。 我正在尝试在控制卡和 CC3220sf - LaunchXL 之间实现 SPI 通信。
要传输的数据是 ADC 值(连续读取)、该值由 CC3220sf (从器件)读取、然后由 F28379D 控制卡(主器件)接收。 我配置了所有内容、甚至握手过程似乎都可以正常工作。 我使用示波器来调试信号并更改代码。 除此之外、我发现调试代码很困难。
我真的尽力了、但我很难理解编码部分。 代码卡在某个头文件的循环中、有时也会出现异常。 我已添加代码和停止位置的屏幕截图供您参考。 如果您能帮我解决这一问题、以便我能够继续、我将不胜感激。
谢谢你
Varunkumar
/* 版权所有(c) 2015-2019、德州仪器(TI)公司 *保留所有权利。 * * 只要 符合以下条件*、允许以源代码和二进制形式重新分发和使用: * *源代码的重新分发必须保留上述版权 声明*、此条件列表和以下免责声明。 * ***二进制形式的再发行必须在 *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。 * ***未经 事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。 * *本软件由版权所有者和贡献者"按原样"提供 *、 不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或 *贡献者都不对任何直接、间接、偶然、特殊、 *模范、 或相应的损害(包括但不限于 *采购替代产品或服务;丧失使用、数据或利润; *或业务中断)、但出于任何责任理论 、*无论是在合同中、严格责任还是由于 使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他) 、*即使已获悉可能会发生此类损坏。 // /* === spislave.c ===== */ #include #include #include /* POSIX 头文件*/ #include #include #include /*驱动程序头文件*/ #include #include #include #include /*驱动程序配置*/ #include "ti_drivers_config.h" #define THREADSTACKSIZE (1024) //#define SPI_MSG_LENGTH (30) //#define SLAVE_MSG ("Hello from slave、msg#:") #define MAX_LOOP (10) 静态 Display_Handle 显示; // GUI Composer 的全局变量*/ uint16_t adcValue = 0; uint16_t threshold = 100; uint16_t ALERT = 0; uint32_t adcValue0MicroVolt; float adcValueVolt; uint16_t slaveRxBuffer; uint16_TsleTxt; /*信号量阻止从器件直到传输完成*/ SEM_t slaveSem; /* === transferCompleteFxn === * SPI_TRANSFCTION ()的回调函数。 // void transferCompleteFxn (SPI_Handle handle、SPI_Transaction *事务) { SEM_post (&slaveSem); } /* *==== slaveThread ==== *从器件 SPI 在同时接收消息的同时向主器件发送消息 来自主设备的*消息。 * void * slaveThread (void * arg0) { SPI_Handle slaveSpi; SPI_Params Parspiams; SPI_Transaction 事务; //uint32_t 一; 布尔 转让; 内部32_t 状态; /* * CONFIG_SPI_MASTER_READY 和 CONFIG_SPI_SLAVE_READY 是连接的 GPIO 引脚 主器件和从器件之间的*。 这些引脚用于同步 *通过一个小的"握手"来控制主器件和从器件应用。 引脚 *稍后用于同步传输并确保主设备不会 *开始传输、直至从设备就绪。 这些引脚的行为 *不同的 spimaster 和 spislave 示例: * * spislave 示例: * * CONFIG_SPI_MASTER_READY 配置为输入引脚。 期间 * "握手"读取此引脚、高电平值将指示 * 主设备已准备好运行应用程序。 之后、引脚为 * 读取以确定主器件是否已打开其 SPI 引脚。 * 当主器件打开其 SPI 时、它将把这个引脚拉低。 * * * CONFIG_SPI_SLAVE_READY 配置为输出引脚。 期间 * "握手"此引脚从低电平更改为高电平输出。 这种情况 * 通知主器件从器件已准备好运行应用程序。 * 之后、从器件使用该引脚向主器件发出通知 * 已准备好进行传输。 当准备好进行传输时、该引脚将会 * 下拉至低电平。 * *下面我们设置 CONFIG_SPI_MASTER_READY 和 CONFIG_SPI_SLAVE_READY 初始值 *"握手"的条件。 * GPIO_setConfig (CONFIG_SPI_SLAVE_READY、GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW); GPIO_setConfig (CONFIG_SPI_MASTER_READY、GPIO_CFG_INPUT); /* *握手-将 CONFIG_SPI_SLAVE_READY 设置为高电平以指示从器件就绪 *以运行。 等待 CONFIG_SPI_MASTER_READY 变为高电平。 * GPIO_WRITE (CONFIG_SPI_SLAVE_READY、0); while (GPIO_Read (CONFIG_SPI_MASTER_READY)=0){} /* *创建同步信标;该信标将阻止从器件 *直到传输完成。 从机配置为回调模式 *以便我们配置 SPI 传输、然后通知主器件 *从设备已准备就绪。 但是、我们仍然必须等待电流传输 *在设置下一个之前完成。 因此、我们等待 slaveSem; *一旦传输完成、回调函数将解除阻止 *从属设备。 * 状态= SEM_INIT (&slaveSem、0、0); if (status!= 0){ display_printf (display、0、0、"创建 slaveSem\n"error creating slaveSem\n"); while (1); } /* *等待主器件 SPI 打开。 配置 SPI 引脚时、将会发生这种情况 *时钟可以从低电平切换到高电平(或从高电平切换到低电平、具体取决于 *极性)。 如果使用3引脚 SPI 且从器件在之前已打开 *假设主器件、时钟转换可能会导致从器件移出位 *这是一个实际的传输。 我们可以通过打开来防止这种行为 *首先主设备,然后打开从设备。 * while (GPIO_Read (CONFIG_SPI_MASTER_READY)=0){} /* *在回调模式下以从器件身份打开 SPI;回调模式用于允许我们这样做 *配置传输、然后将 CONFIG_SPI_SLAVE_READY 设置为高电平。 * SPI_Params_init (&spiParams); spiParams.frameFormat = SPI_POL0_PHA1; spiParams.mode = SPI_SLAVE; spiParams.transferCallbackFxn = transferCompleteFxn; spiParams.transferMode = SPI_MODE_CALLACK; slaveSpi = SPI_open (CONFIG_SPI_SLAVE、&spiParams); if (slaveSpi == NULL){ Display_printf (display、0、0、"初始化从器件 SPI\n"时出错); while (1); } 否则{ display_printf (display、0、0、"已初始化从属 SPI \n"); } /*将消息复制到发送缓冲区*/ // strncpy (((char *) slaveTxBuffer、slave_MSG、SPI_MSG_LENGTH); slaveTxBuffer = adcValue; /*初始化从属 SPI 事务结构*/ // slaveTxBuffer[sizeof (slave_MSG)-1]=(i % 10)+'0'; memset ((void *) slaveRxBuffer、0、sizeof (adcValue)); transaction.count = sizeof (adcValue); transaction.txBuf =(void *) slaveTxBuffer; transaction.rxBuf =(void *) slaveRxBuffer; /*打开用户 LED 指示灯,指示正在进行 SPI 传输*/ GPIO_TOGGLE (CONFIG_GPIO_LED_1); /* *设置 SPI 传输;CONFIG_SPI_SLAVE_READY 将设置为通知 *主设备从设备就绪。 * transferOK = SPI_transfer (slaveSpi、事务); if (transferOK){ GPIO_WRITE (CONFIG_SPI_SLAVE_READY、1); /*等待传输完成*/ SEM_WAIT (slaveSem); /* *将 CONFIG_SPI_SLAVE_READY 驱动为高电平以指示从器件未就绪 *用于另一个传输。 * GPIO_WRITE (CONFIG_SPI_SLAVE_READY、1); display_printf (display、0、0、"从机接收到:%s"、slaveRxBuffer); } 否则{ display_printf (display、0、0、"从器件 SPI 传输失败"); } SPI_Close (slaveSpi); /*示例完成-将引脚设置为已知状态*/ GPIO_setConfig (CONFIG_SPI_MASTER_READY、GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW); GPIO_WRITE (CONFIG_SPI_SLAVE_READY、0); display_printf (display、0、0、"\nDone"); 返回(NULL); } void *线程 Fxn0 (void * arg0) { /*打开 ADC 驱动程序*/ uint32_t 时间= 100000;//更新~10/秒 ADC_Handle ADC; ADC_Params 参数; ADC_PARAMS_INIT (params); ADC = ADC_open (CONFIG_ADC_0、params); if (ADC == NULL){ //初始化 ADC 通道0时出错 while (1); } while (1){ int_fast16_t res; RES = ADC_convert (ADC、&adcValue); if (res == ADC_STATUS_SUCCESS){ adcValue0MicroVolt = adc_convertRawToMicroVolts (adc、adcValue); adcValueVolt = adcValue0MicroVol*0.000001*998/422; display_printf (display、0、0、"ADC0原始结果:%d\n"、adcValue); display_printf (display、0、0、"ADC0 convert result:%d uV\n"、 adcValue0MicroVolt); if (adcValue >= threshold){ GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON); 警报= 1; } 否则{ GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_OFF); 警报= 0; } } usleep(time); } } /* === mainThread ==== // void * mainThread (void * arg0) { /*~10个循环/秒*/ GPIO_WRITE (CONFIG_SPI_SLAVE_READY、0); /*调用驱动程序初始化函数*/ GPIO_init(); adc_init(); // I2C_init (); spi_init(); // uart_init(); // Watchdog_init(); pthread_t thread0、thread1; pthread_attr_t attrs; struct sched_param primParam; 内部 REC; 内部 detachState; /*调用驱动程序初始化函数。 * display_init(); /*配置 LED 引脚*/ GPIO_setConfig (CONFIG_GPIO_LED_0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW); GPIO_setConfig (CONFIG_GPIO_LED_1、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW); //打开显示进行输出 Display = Display_open (Display_Type_UART、NULL); if (display =NULL){ /*无法打开显示驱动程序*/ while (1); } /*打开用户 LED */ GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON); display_printf (display、0、0、"启动 SPI 从设备示例"); display_printf (display、0、0、"此示例要求外部电线为" "已连接至接头引脚。 有关详细信息、请参阅 Board.html。\n"); /*创建应用程序线程*/ pthread_attr_init (atttrs); detachState = pthread_create_detached; /*设置优先级和堆栈大小属性*/ retc = pthread_attr_setdetachstate (&attrs、detachState); 如果(retc!= 0){ /* pthread_attr_setdetachstate()失败*/ while (1); } retc |= pthread_attr_setstacksize (&attrs、THREADSTACKSIZE); 如果(retc!= 0){ /* pthread_attr_setstacksize()失败*/ while (1); } /*创建从线程*/ priParam.sched_priority = 1; pthread_attr_setschedparam (&attrs、&priParam); retc = pthread_create (&thread0、&attrs、threadFxn0、NULL); 如果(retc!= 0){ /* pthread_create()失败*/ while (1); } retc = pthread_create (&thread1、&attrs、slaveThread、NULL); 如果(retc!= 0){ /* pthread_create()失败*/ while (1); } 返回(NULL); }
F28379D SPI 代码 //################################################################################################################ // ////文件:spi_ex1_loopback.c // //标题:SPI 数字环回 // ! \addtogroup driver_example_list //!SPI 数字环回
//! //! 该程序使用 SPI 模块的内部回送测试模式。 此 //! 是一个非常基本的回送、不使用 FIFO 或中断。 a //! 发送数据流、然后与接收到的数据流进行比较。 //! //! 发送的数据如下所示:\n //! 0000 0001 0002 0003 0004 0005 0006 0007… FFFE FFFF 0000 //! //! 这种模式会一直重复。 //! //! b 外部连接\n //! -无 //! //! b 监视\b 变量\n //! -\b sData -要发送的数据 //! -\b RDATA -接收到的数据 //! // //########################################################################################################################## //$TI 发行版:F2837xD 支持库 v3.08.00.00 $ //$发行 日期:Mon Dec 23 17:32:30 IST 2019 $ //版权所有: //版权所有(C) 2013-2019德州仪器(TI)公司- http://www.ti.com/ // 只要 满足以下条件,就允许以源代码和二进制形式重新分发和使用//修改或不修改//: // //重新分发源代码必须保留上述版权 //声明、此条件列表和以下免责声明。 // //二进制形式的再发行必须复制上述版权 //声明、此条件列表和// 分发随附的//文档和/或其他材料中的以下免责声明。 //// 未经 事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。 //// 本软件由版权所有者和贡献者提供 //“按原样”,不 承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权 //所有者或贡献者都不对任何直接、间接、偶然、 //特殊、模范、 或相应的损害(包括但不 限于采购替代产品或服务;丧失使用、 //数据或利润; 或业务中断)、无论 出于何种原因使用 本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。 //$ //######################################################################################################################## // //包含的文件 // #include "driverlib.h" #include "device.h" // //循环运行的次数(如果需要增加次数) // uint16_t loop_count = 100; // 函数原型 // void initSPI (void); // Main // void main (void) { uint16_t sData = 0; //发送数据 uint16_t RDATA = 0; //接收数据 // //初始化设备时钟和外设 // device_init(); // //禁用引脚锁定并启用内部上拉。 // DEVICE_initGPIO(); GPIO_setPadConfig (40、GPIO_PIN_TYPE_PULLUP); //启用 GPIO13上的上拉 GPIO_setPinConfig (GPIO_40_GPIO40); // GPIO13 = GPIO13 GPIO_setDirectionMode (40、GPIO_DIR_MODE_IN); // GPIO13 =输入 GPIO_setPadConfig (41、GPIO_PIN_TYPE_PULLUP);//在 GPIO11上启用上拉 //GPIO_writePin (11、0); //负载输出锁存 GPIO_setPinConfig (GPIO_41_GPIO41); // GPIO11 = GPIO11 GPIO_setDirectionMode (41、GPIO_DIR_MODE_OUT);// GPIO11 =输出 GPIO_writePin (41、0);//主机准备好接收 while (GPIO_readPin (40)= 1){} GPIO_writePin (41、1); GPIO_setPadConfig (16、GPIO_PIN_TYPLE_PULLUP);// GPIO16上的上拉(SPISIMOA) GPIO_setPadConfig (17、GPIO_PIN_TYPLE_PULLUP);// GPIO17上的上拉(SPIS0MIA) GPIO_setPadConfig (18、GPIO_PIN_TYPLE_PULLUP);// GPIO18上的上拉(SPICLKA) GPIO_setPadConfig (19、GPIO_PIN_TYPLE_PULLUP);// GPIO19上的上拉(SPISTEA) GPIO_setQualificationMode (16、GPIO_QUAL_异 步);//异步输入 GPIO_setQualificationMode (17、GPIO_QUAL_异 步);//异步输入 GPIO_setQualificationMode (18、GPIO_QUAL_异 步);//异步输入 GPIO_setQualificationMode (19、GPIO_QUAL_异 步);//异步输入 GPIO_setPinConfig (GPIO_16_SPISIMOA); // GPIO16 = SPISIMOA GPIO_setPinConfig (GPIO_17_SPISOMIA); // GPIO17 = SPIS0MIA GPIO_setPinConfig (GPIO_18_SPICLKA); // GPIO18 = SPICLKA GPIO_setPinConfig (GPIO_19_SPISTEA); // GPIO19 = SPISTEA // //初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。 // interrupt_initModule(); // //使用指向 shell 中断的指针初始化 PIE 矢量表 //服务例程(ISR)。 // interrupt_initVectorTable(); // //设置 SPI,将其初始化为 FIFO 模式 // initspi(); GPIO_writePin (41、1); // //启用全局中断(INTM)和实时中断(DBGM) // EINT; ERTM; // //永久循环。 暂停或放置断点以观察缓冲区。 // while (1) { //发送数据 SPI_writeDataNonBlocking (SPIA_BASE、sData); //阻止直到数据被接收并返回 RDATA = SPI_READDataBlockingNonFIFO (SPIA_BASE); //根据已发送的数据检查已接收的数据 /* if (RDATA!= sData) { //出现错误。 RDATA 不包含预期数据。 Example_Fail = 1; ESTOP0; } * sData++; Example_PassCount++; } } // ////功能,用于配置 FIFO 模式中的 SPI A。 // void initspi() { // //必须在配置 SPI 之前将其复位 // SPI_disableModule (SPIA_BASE); // // SPI 配置。 使用1MHz SPICLK 和16位字大小。 // SPI_setConfig (SPIA_BASE、DEVICE_LSPCLK_FREQ、SPI_PROT_POL0PHA0、 SPI_MODE_MASTER、1000000、16); //SPI_enableLoopback (SPIA_BASE); SPI_setEmulationMode (SPIA_BASE、SPI_emulation_stop_after_transmit); // //配置完成。 启用模块。 // SPI_enableModule (SPIA_BASE); }
您好 Varunkumar、
您现在如何将数据复制到传输缓冲区中?
您能否尝试使用两个 CC3220 LaunchPad 从基本 SPI_SLAVE 和 SPI_MASTER 示例开始? 在使用 TMS320进行调试之前、您可以将 ADC 实现添加到 SDK 示例中并来回发送数据以验证您是否具有正确的格式: http://dev.ti.com/tirex/explore/node?node=AJSfuJZZeSex2TkSjqSCnA__fc2e6sr__LATEST
此致、
Sarah