NXP MCU 技术论坛
直播中

从未拥有

9年用户 971经验值
擅长:可编程逻辑 电源/新能源 光电显示
私信 关注
[问答]

如何在LPC4370运行时切换SPI模式?

我想寻求一些帮助,了解如何在 LPC4370 运行时切换 SPI 模式。我考虑过这篇文章是针对与我正在经历的问题类似的问题发表的,但这与我使用 LPC 的可能性不符。这可能非常简单,但我似乎深陷其中。
问题

我正在使用 SSP1,并连接了三个从站。每个从机在不同的 SPI 模式下运行。在初始化期间,我成功地与所有三个通信
1. 从机 0 --> SPI 模式 1
2. 从机 1 --> SPI 模式 0
3. 从机 2 --> SPI 模式 3
但是在 slave 2 初始化之后,我需要在无限循环中使用以下功能:
1.与Slave 1通信(SPI模式0)
2.与slave 2通信(SPI模式3)
3.回到步骤1重复
(不再与从站 0 通信)。
我所看到的是,在从站 2 启动后,如果我想与从站 1 通信,SPI 模式将固定为 SPI 模式 3(这是预期的,因为我正在使用指向 SSP 基的指针,请参见代码)。但是当使用逻辑分析器时,我看到的行为更类似于不同的 SPI 模式(我希望看到从机 1 在 SPI 模式 3 下通信):
环境
从机 2

从机 1

结果通信。初始化后的从站 1。从机 2

模式
方式三
模式 0
方式二
CPOL
1个
0
1个
CPHA
1个
0
0

环境
从机 2

从机 1

结果通信。初始化后的从站 1。从机 2

模式
方式一
模式 0
方式一
CPOL
0
0
0
CPHA
1个
0
1个
通缉情况

我需要在运行时快速切换 SPI 模式以与两个从设备接口:
设置:
  • 在 SPI 模式 0 中初始化从机 1
  • 在 SPI 模式 3 中初始化从机 2

无限循环:
  • 将 SPI 模式切换为 0(从机 1)
  • 从机 1(SPI 模式 0)--> 通信测量
  • 将 SPI 模式切换为 3(从机 2)
  • 从站 2 --> 通信测量
  • 回到循环内的第 1 步
使用的代码

#define LPC_SSP                   LPC_SSP1
/* Slave 1 initialization */
void SL1_init()
{
    (var 'ports' init)
    Chip_SSP_Disable(LPC_SSP);
    SL1_Init(LPC_SSP, ports, TDC_clock_freq);
}
void SL1_Init(LPC_SSP_T* SPI_BUS, SL_ports config, float Clock_frequency)
{
        Slave1_SPI = SPI_BUS; //global var inside of this file
        SL1_Init_SPI();
        // init ports
        Clock_Frequency = Clock_frequency;
}


void SL1_Init_SPI()
{
        Chip_SSP_Init(Slave1_SPI);
        SSP_ConfigFormat ssp_format;
        ssp_format.frameFormat = SSP_FRAMEFORMAT_SPI;
        ssp_format.bits = SSP_DATA_BITS;
        ssp_format.clockMode = SSP_CLOCK_MODE0;
        Chip_SSP_SetFormat(Slave1_SPI, ssp_format.bits, ssp_format.frameFormat, ssp_format.clockMode);
    Chip_SSP_SetMaster(Slave1_SPI, 1);
    Chip_SSP_SetBitRate(Slave1_SPI, 10000000);
        Chip_SSP_Enable(Slave1_SPI);
}

对于奴隶 2:


void Init_Slave2(LPC_SSP_T* spi_bus, Slave2_con config)
{
        Slave2_SPI = spi_bus;
        Slave2_Init_SPI();
        //pin init
}

void Slave2_Init_SPI()
{
//        Chip_SSP_Disable(Slave2_SPI);//new

        Chip_SSP_Init(Slave2_SPI);

        SSP_ConfigFormat ssp_format;
        ssp_format.frameFormat = SSP_FRAMEFORMAT_SPI;
        ssp_format.bits = SSP_DATA_BITS;
        ssp_format.clockMode = SSP_CLOCK_MODE3; //can be 1 or 3
        Chip_SSP_SetFormat(Slave2_SPI, ssp_format.bits, ssp_format.frameFormat, ssp_format.clockMode);
    Chip_SSP_SetMaster(Slave2_SPI, 1);
    Chip_SSP_SetBitRate(Slave2_SPI, 1000000);

        Chip_SSP_Enable(Slave2_SPI);
}


事情已经尝试过

两个从设备都将指针直接更改为 LPC_SSP。我认为需要哪个?我以为我可以在运行时“只是”调用 slavex_init_spi() 函数,但这导致 LPC_SSP C0 寄存器被完全搞砸了:
引发
测量回路
从站 1 定义在从站 2 之前

从站 2 已定义
从机1通信(先调用slave1_init_SPI函数)
十六进制:0xa07
二进制:101000000111
十六进制:0x65c7
二进制:110010111000111
十六进制:0xfe87
二进制:1111111010000111

注意事项

我是否需要在尝试通信之前或之后的 SPI 重新启动之间添加强制延迟?
我不能简单地使用不同的 SSP 端口,因为控制器连接到自定义 PCB(以前工作过,但我没有该代码)。

更多回帖

发帖
×
20
完善资料,
赚取积分