您好!
我想将 CC2538 SPI-0端口用作从接口。 要尝试 SPI 从模式输出、我已按照以下方式修改了提供的 SPI 主器件示例:
内部
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:更改此选项以选择您正在使用的端口/引脚。
//
IOCPinConfigPeriphInput (Example_GPIO_SSI_base、Example_PIN_SSI_CLK、
IOC_CLK_SSI_SSI0);
IOCPinConfigPeriphInput (Example_GPIO_SSI_base、Example_PIN_SSI_FSS、
IOC_SSIFSSIN_SSI0);
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_SLAVE、SysCtrlClockGet ()/64、8);
//
//启用 SSI0模块。
//
SSIEnable (SSI0_BASE);
//
//从 SSI 端口读取任何残留数据。 这将确保接收
// FIFO 为空,因此我们不会读取任何不需要的垃圾。 这在这里完成
//因为 SPI SSI 模式为全双工模式,允许您发送和
//同时接收。 SSIDataGetNonBlocking 函数返回
//返回数据时为"true",未返回数据时为"false"。
//“非阻塞”函数检查接收中是否有数据
// FIFO、如果没有、则不会"挂起"。
//
while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx[0]))
{
}
//
//接收未确定。
//
while (1)
{
//
//使用“阻塞”GET 函数接收数据。 此函数
//将等待接收 FIFO 中有数据后再返回。
//
SSIDataGet (SSI0_BASE、&pui32DataRx[0]);
//
//由于我们使用的是8位数据,所以屏蔽 MSB。
//
pui32DataRx[0]&= 0x00FF;
//
//显示 SSI0接收到的数据。
//
UARTprintf ("'%c'"、pui32DataRx[0]);
}
(笑声)
我无法作为 SPI 从器件接收数据。 在主模式下、我可以发送和接收数据。
我知道我必须使用正确的引脚(CLK 是输入、FSS 是输入 MISO 是输出、MOSI 是输入)。 我有相应的连接。
我的印象是、引脚复用不正确。 我没有获得主器件提供的时钟信号、没有发生中断。
感谢你的帮助!
弗兰克