工具/软件:Code Composer Studio
您好!
从 MAX31855MPB1 (热电偶)读取温度时出现问题。 我正在使用 SPI 通信、并尝试使用 SSI0端口从 MAX31855进行读取。
但是、它不会从 MAX31855读取任何值。 我使用调试来查看我是否从 SPI 获取任何数据、但它停留在
SSIDataGet (SSI0_BASE、&pui32DataRx[ui32Index]);//代码在此处停止,不会转到任何位置
有人能帮我解决这个问题吗? 我需要在代码中更改什么才能使其读取。 因为这是热电偶。 我只想从传感器读取值。 此操作无需 Tx。
// // // spi_slave.c -演示如何在 SPI 从 设备//中配置 SSI0的示例 模式。 // //版权所有(c) 2010-2017 Texas Instruments Incorporated。 保留所有权利。 //软件许可协议 // 以源代码和二进制形式重新分发和使用,无论是否 进行//修改,只要 满足以下条件//: // 重新分发源代码必须保留上述版权 //声明、此条件列表和以下免责声明。 // //二进制形式的再发行必须复制上述版权 //声明、此条件列表和// 分发随附的//文档和/或其他材料中的以下免责声明。 //// 未经 事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。 //// 本软件由版权所有者和贡献者提供 //“按原样”,不 承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权 //所有者或贡献者都不对任何直接、间接、偶然、 //特殊、模范、 或相应的损害(包括但不 限于采购替代产品或服务;丧失使用、 //数据或利润; 或业务中断)、无论 出于何种原因使用 本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。 // //这是 Tiva 固件开发包的修订版2.1.4.178的一部分。 //// ***************** #include #include #include #include "inc/hw_memmap.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/ssi.h" #include "driverlib/sysctl.h" #include "driverlib/uart.h" #define target_is_TM4C129_RAudio" #include "mdio/uart.h"#include "#define ROM" // //! \addtogroup SSI_examples_list //!SPI 从器件(SPI_SLAVE)
//! //! 此示例展示了如何将 SSI0配置为 SPI 从器件。 代码将 //! 在从器件 Tx 上发送三个字符、然后轮询接收 FIFO、直到 //! 从机 Rx 上接收到3个字符。 //! //! 此示例使用以下外设和 I/O 信号。 您必须 //! 查看这些内容并根据您自己的董事会需要进行更改: //! - SSI0外设 //! - GPIO 端口 A 外设(用于 SSI0引脚) //! SSI0Clk - PA2 //! - SSI0Fss - PA3 //! - SSI0Rx - PA4 //! - SSI0Tx - PA5 //! //! 以下 UART 信号仅配置为显示控制台 //! 消息。 SSI0的运行不需要这些。 //! - UART0外设 //! - GPIO 端口 A 外设(用于 UART0引脚) //! - UART0RX - PA0 //! - UART0TX - PA1 //! //! 此示例使用以下中断处理程序。 要使用此示例 //! 在您自己的应用程序中、您必须将这些中断处理程序添加到 您的//! 矢量表。 //! -无。 //// ***************** // // //要发送和接收的字节数。 //// ***************** #define NUM_SSI_DATA 3 uint32_t ui32SysClock; char str[20]; /* reverse:reverse string s in place */ void reverse (char s[]) { int i、j; 字符 c; 对于(i = 0、j = strlen (s)-1;i '0';="" get="" next="" digit="" while="" ((n="" =="" 10)="">0); /*删除它*/ 如果(符号< 0) S[i++]='-'; S[i]='\0'; 倒车档; } //********* // //此函数将 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); } //********* // //配置从飞思卡尔(SPI)模式中的 SSI0。 此示例将发出 // 3个字节的数据,然后等待3个字节的数据进入。 这将全部由 //使用轮询方法完成。 //// ***************** void SSI_init (void) { uint32_t 初始数据; // //必须启用 SSI0外设才能使用。 // SysCtlPeripheralEnable (SYSCTL_Periph_SSI0); SSIDisable (SSI0_BASE);//禁用 SPI // //对于本示例,SSI0与 Porta[5:2]一起使用。 实际端口和引脚 //您的器件上使用的可能不同、请参阅数据表以了解更多信息 //信息。 GPIO 端口 A 需要启用、以便可以使用这些引脚。 // TODO:将其更改为您正在使用的 GPIO 端口。 // //SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);//已为 UART0启用 // //为端口 A2、A3、A4和 A5上的 SSI0功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PA2_SSI0CLK);// SCK GPIOPinConfigure (GPIO_PA3_SSI0FSS);// SS //GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);// MOSI -取消使用 Tx - GPIO_PA4_SSI0XDAT0 GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);// MISO Rx - GPIO_PA5_SSI0XDAT1 // //配置 SSI 引脚的 GPIO 设置。 该函数也会提供 将这些引脚的//控制到 SSI 硬件。 请参阅中的数据表 //查看每个引脚分配的函数。 //引脚分配如下: // PA5 - SSI0Tx // PA4 - SSI0Rx // PA3 - SSI0Fss // PA2 - SSI0CLK // TODO:更改此选项以选择您正在使用的端口/引脚。 // // GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2); GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_3 | GPIO_PIN_2); // //为 SPI 从模式配置和启用 SSI 端口。 使用 SSI0、 //系统时钟电源,空闲时钟低电平和低电平有效时钟输入 //飞思卡尔 SPI 模式、从模式、1MHz SSI 频率和8位数据。 //对于 SPI 模式,可以设置 SSI 时钟的极性 //单元空闲。 您还可以配置所需的时钟边沿 //在上捕获数据。 有关的更多信息、请参阅数据表 //不同的 SPI 模式。 // //为 TI 主控模式配置和启用 SSI 端口。 使用 SSI0系统 //时钟电源、主控模式、1MHz SSI 频率和8位数据。 SSIConfigSetExpClk (SSI0_BASE、ui32SysClock、SSI_FRF_MOTO_MOTO_0、SSI_MODE_MASTER、10000、 16);//SSI_MODE_SLAVE // //启用 SSI0模块。 // SSIEnable (SSI0_BASE); //清除 RX FIFO 中可能存在的任何初始数据 while (SSIDataGetNonBlocking (SSI0_BASE、初始数据)); } int main (void) { // uint32_t data; uint32_t pui32DataRx[NUM_SSI_DATA]; uint32_t ui32Index; // //将时钟设置为直接从外部晶振/振荡器运行。 // TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值 板上的//晶体。 // ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000); // //设置用于显示消息的串行控制台。 这是 //仅用于此示例程序,SSI 操作不需要。 // InitConsole(); SSI_init(); for (ui32Index = 0;ui32Index < NUM_SSI_DATA;ui32Index++) { pui32DataRx[ui32Index]= 0; // //使用“阻塞”GET 函数接收数据。 此函数 //将等待接收 FIFO 中有数据后再返回。 // SSIDataGet (SSI0_BASE、&pui32DataRx[ui32Index]); // //由于我们使用的是8位数据,所以屏蔽 MSB。 // pui32DataRx[ui32Index]&= 0x00DF; // //显示 SSI0接收到的数据。 // itoa(pui32DataRx[ui32Index],str); UARTprintf (str); } }