我想寻求一些帮助,了解如何在 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 ini
tialization */
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(以前工作过,但我没有该代码)。