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.

[参考译文] CC2538 SPI 写入和读取

Guru**** 2538955 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/710793/cc2538-spi-write-and-read

我是 CC2538 、用于从 MRAM 收集数据。 基本原理是 CC2538 处于主控模式、它将向 MRAM 发送数据、然后 MRAM 将数据返回 到 CC2538。  SSIDataGet 的输出始终为0xFF。我正在尝试按如下方式修改我的代码、您能告诉我 它为什么不起作用。非常感谢。

/*********
*文件名:SPI_MASTER.c
*修订日期:$Date: 2013-04-1011:13:39+0200(星期三,2013年4月10日)$
*修订版:$修订 版:9701美元
*
*说明:演示如何在 SPI 主设备中配置 SSI0的示例
*模式。
*
*版权所有(C) 2013德州仪器(TI)公司- http://www.ti.com/
*
*
*以源代码和二进制形式重新分发和使用、有无
*如果满足以下条件、则允许进行修改
符合*:
*
*源代码的重新分发必须保留上述版权
*注意、此条件列表和以下免责声明。
*
*二进制形式的再发行必须复制上述版权
*请注意、中的此条件列表和以下免责声明
*随分发提供的文档和/或其他材料。
*
*德州仪器公司的名称和名称均不相同
*其贡献者可用于认可或推广衍生产品
*未经特定的事先书面许可。
*
*本软件由版权所有者和贡献者提供
*"按原样"以及任何明示或暗示的保证、包括但不包括
*仅限于对适销性和适用性的暗示保证
*一项特定目的不予承认。 在任何情况下、版权均不得
*所有者或贡献者应对任何直接、间接、偶然或
*特殊、惩戒性或后果性损害(包括但不包括)
*仅限于采购替代货物或服务;丧失使用、
*数据或利润;或业务中断)
*责任理论、无论是合同责任、严格责任还是侵权行为
*(包括疏忽或其他)因使用而以任何方式产生
*、即使被告知可能会发生此类损坏。
*
秘书长的报告 /

#include
#include
#include "hw_memmap.h"
#include "HW_IOC.h"
#include "gpio.h"
#include "IOC.h"
#include "SSI.h"
#include "UART.h"
#include "sys_ctrl.h"
#include "uartstdio.h"


//
//注意:
//此示例已在 SmartRF06评估板上运行。
//将 Tx (PA5)和 Rx (PA4)引脚短接在一起。
//代码在 Tx 线路上发送数据,同时将 Tx 和 Rx 引脚短接
//您正在创建环回。 然后、代码会验证您的数据
//接收的代码与您发出的代码匹配。 使用终端窗口
//查看发送和接收的数据的结果。
//
//
//
//! 添加到组 SSI_Examples_list
//!

SPI 主器件(SPI_MASTER)


//!
//! 此示例展示了如何将 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 Example_PIN_SSI_CLK GPIO_PIN_4
#define Example_PIN_SSI_FSS GPIO_PIN_7
#define Example_PIN_SSI_RX GPIO_PIN_5
#define Example_PIN_SSI_TX GPIO_PIN_6
#define Example_GPIO_SSI_base GPIO_C_base

#define Example_PIN_UART_RXD GPIO_PIN_0
#define Example_PIN_UART_TXD GPIO_PIN_1
#define Example_GPIO_UART_base GPIO_A_base


//
//
//要发送和接收的字节数。
//
//
#define NUM_SSI_DATA 3.

//
//
//此函数将 UART0设置为用于控制台显示信息
//因为示例正在运行。
//
//
无效
InitConsole (空)

//
//将 UART 信号映射到正确的 GPIO 引脚并将其配置为
//硬件控制。
//
IOCPinConfigPeriphOutput (example_GPIO_UART_base、example_PIN_UART_TXD、
IOC_MUX_OUT_SEL_UART0_TXD);
GPIOPinTypeUARTOutput (example_GPIO_UART_base、example_PIN_UART_TXD);

IOCPinConfigPeriphInput (Example_GPIO_UART_base、Example_PIN_UART_RXD、
IOC_UARTRXD_UART0);
GPIOPinTypeUARTInput (Example_GPIO_UART_base、Example_PIN_UART_RXD);

//
//初始化控制台 I/O 的 UART (UART0)
//
UARTStdioInit (0);

//
//
//在主 Freescale (SPI)模式下配置 SSI0。 此示例将发出
// 3个字节的数据,然后等待3个字节的数据进入。 这就是全部
//使用轮询方法完成。
//
//
内部
main (空)

uint32_t pui32DataTx[NUM_SSI_DATA];
uint32_t pui32DataRx[NUM_SSI_DATA];
uint32_t ui32Index;

//
//将时钟设置为直接从外部晶振/振荡器运行。
//(无外部32k osc、无内部 osc)
//
SysCtrlClockSet (false、false、SYS_CTRL_SYSDIV_32MHz);

//
//将 IO 时钟设置为与系统时钟相同
//
SysCtrlIOClockSet (SYS_CTRL_SYSDIV_32MHz);

//
//设置用于显示消息的串行控制台。 这是
//仅用于此示例程序,SSI 操作不需要。
//
InitConsole();

//
//在控制台上显示设置。
//
UARTprintf ("SSI ->\n");
UARTprintf ("模式:SPI\n");
UARTprintf ("数据:8位\n");

//
//必须启用 SSI0外设才能使用。
//
SysCtrlPeripheralEnable (SYS_CTRL_Periph_SSI0);

//
//在配置模块之前禁用 SSI 功能
//
SSIDisable (SSI0_BASE);

//
//将 IO 时钟设置为 SSI 时钟源
//
SSIClockSourceSet (SSI0_BASE、SSI_Cock_PIOSC);

//
//对于本示例,SSI0与 PA2-PA5一起使用。 实际端口和引脚
//您的器件上使用的可能不同、请参阅数据表以了解更多信息
//信息。 GPIO 端口 A 需要启用、以便可以使用这些引脚。
// TODO:将其更改为您正在使用的 GPIO 端口。
//
//为端口 A2、A3、A4和 A5上的 SSI0功能配置引脚复用。
//如果您的器件不支持引脚复用、则无需执行此步骤。
// TODO:更改此选项以选择您正在使用的端口/引脚。
//

IOCPinConfigPeriphOutput (example_GPIO_SSI_base、example_PIN_SSI_CLK、
IOC_MUX_OUT_SEL_SSI0_CLKOUT);

IOCPinConfigPeriphOutput (example_GPIO_SSI_base、example_PIN_SSI_FSS、
IOC_MUX_OUT_SEL_SSI0_FSSOUT);

IOCPinConfigPeriphOutput (example_GPIO_SSI_base、example_PIN_SSI_TX、
IOC_MUX_OUT_SEL_SSI0_TXD);

IOCPinConfigPeriphInput (Example_GPIO_SSI_base、Example_PIN_SSI_RX、
IOC_SSIRXD_SSI0);
//
//配置 SSI 引脚的 GPIO 设置。 该函数也会提供
将这些引脚的//控制到 SSI 硬件。 请参阅中的数据表
//查看每个引脚分配的函数。
//引脚分配如下:
// PA5 - SSI0Tx
// PA4 - SSI0Rx
// PA3 - SSI0Fss
// PA2 - SSI0CLK
// TODO:更改此选项以选择您正在使用的端口/引脚。
//
GPIOPinTypeSSI (Example_GPIO_SSI_base、Example_PIN_SSI_CLK |
Example_PIN_SSI_FSS | Example_PIN_SSI_RX |
Example_PIN_SSI_TX);
GPIOPinTypeSSI (Example_GPIO_SSI_base、Example_PIN_SSI_CLK |
Example_PIN_SSI_RX | Example_PIN_SSI_TX);

//
//将 SSI 模块配置为 Motorola/Freescale SPI 模式3:
//极性= 1、SCK 稳定状态为高电平
//相位= 1、数据在第一个时钟边沿发生变化并在第二个时钟边沿捕捉
//字大小= 8位
//
SSIConfigSetExpClk (SSI0_BASE、SysCtrlIOClockGet ()、SSI_FRF_MOTO_MODE_3、
SSI_MODE_MASTER、SysCtrlClockGet ()/2、8);

//
//启用 SSI0模块。
//
SSIEnable (SSI0_BASE);

//
//从 SSI 端口读取任何残留数据。 这将确保接收
// FIFO 为空,因此我们不会读取任何不需要的垃圾。 这在这里完成
//因为 SPI SSI 模式为全双工模式,允许您发送和
//同时接收。 SSIDataGetNonBlocking 函数返回
//返回数据时为"true",未返回数据时为"false"。
//“非阻塞”函数检查接收中是否有数据
// FIFO、如果没有、则不会"挂起"。
//
while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx[0]))

//
//初始化要发送的数据。
//
pui32DataTx[0]="S";
pui32DataTx[1]='p';
pui32DataTx[2]='I';

//
//显示 SSI 正在发送数据的指示。
//
UARTprintf ("sent:\n ");

//
//发送3个字节的数据。
//
for (ui32Index = 0;ui32Index < NUM_SSI_DATA;ui32Index++)

//
//显示 SSI 正在传输的数据。
//
UARTprintf ("'%c'"、pui32DataTx[ui32Index]);

//
//使用“阻塞”Put 函数发送数据。 此函数
//将等待发送 FIFO 中有空间后再返回。
//这使您可以确保发送的所有数据都将其输入
//发送 FIFO。
//
SSIDataPut (SSI0_BASE、pui32DataTx[ui32Index]);

//
//等待 SSI0完成传输发送 FIFO 中的所有数据。
//
while (SSIBusy (SSI0_BASE))

//
//显示 SSI 正在接收数据的指示。
//
UARTprintf ("\n 接收:\n ");

//
//接收3个字节的数据。
//
for (ui32Index = 0;ui32Index < NUM_SSI_DATA;ui32Index++)

//
//使用“阻塞”GET 函数接收数据。 此函数
//将等待接收 FIFO 中有数据后再返回。
//
SSIDataGet (SSI0_BASE、&pui32DataRx[ui32Index]);

//
//由于我们使用的是8位数据,所以屏蔽 MSB。
//
pui32DataRx[ui32Index]&= 0x00FF;

//
//显示 SSI0接收到的数据。
//
UARTprintf ("'%c'"、pui32DataRx[ui32Index]);

//###### 自检开始####
//
//检查发送的数据是否与接收的数据相同。
//
for (ui32Index = 0;ui32Index < NUM_SSI_DATA;ui32Index++)

if (pui32DataTx[ui32Index]!= pui32DataRx[ui32Index])

//
//告诉用户测试失败。
//
UARTprintf ("\n\n 错误:数据不完全匹配。\n");
UARTprintf ("检查 Tx 和 Rx 是否短接在一起。\n\n");

//
//无限循环等待调试。
//
while (1)



//
//告诉用户测试通过。
//
UARTprintf ("\n\n 测试通过。\n\n");
//###### 自检结束####

//
//完成-输入无限循环。
//
while (1)


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我们将对此进行研究、并向您提供答案。 由于暑假、这可能需要比平常更长的时间。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您能否详细说明一下这个 MRAM 以及它到底是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    关闭这个线程、因为我们没有听到您的反馈。