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.
工具/软件:Code Composer Studio
大家好、我想将 TMS570LS1224 Launchpad 连接为 SPI1主器件、将 microchip dspic33ev256GM106入门套件连接为 SPI 从器件
我在 SPI1全局:我启用了主控模式和内部时钟
在 SPI1数据格式中:我输入100000Hz 波特率
0极性和0相位
在 SPI1端口 I 中、启用了 SIMO、MOSI、CLK、CS[0]和 ENA 作为 SPI 功能
另一个 CS[1-5]作为 GIO
然后生成代码、我遵循 SPI 示例代码
我的第一个问题
1) 1)我在上面所做的是真的吗?
2) 2)我是否需要在代码中包含这些行?
spiDAT1_t 数据通信 fig1_t;
dataconfig1_t.CS_hold = true;
dataconfig1_t.WDEL = true;
dataconfig1_t.DFSEL = SPI_FMT_0;
dataconfig1_t.CSNR = 0xFE;
您好、B.M、
您的配置良好。 我刚刚检查 了 dspic33ev256GM106数据表、该器件不支持 SPI 使能引脚。 因此、4线制模式适合您:CS、CLK、SIMO、SOMI
如果您使用 HALCOGen 生成的 SPI API、则需要定义和使用数据通信1_t
dspic33ev256GM106器件是否支持 CSHOLD 功能? CSHOLD 表示芯片选择在两次传输之间保持有效。
从微芯片数据表中可以看出、MCU 有两位
1) CKE:SPIx 时钟边沿选择位
1 =从有效时钟状态转换为空闲时钟状态时、串行输出数据发生变化
0 =从空闲时钟状态转换为活动时钟状态时、串行输出数据发生变化
2) CKP:时钟极性选择位
1 =时钟的空闲状态为高电平;活动状态为低电平
0 =时钟的空闲状态为低电平;活动状态为高电平
那么、您认为如何配置 Hercules 以与其兼容。
我是否需要写入 CSHOLD =false; ? 在 halcogen 配置中,我设置极性0,相0。
这是我的 HAL 设置
看看我的 SPI 主设备代码吧
/*用户代码结束*/ *包含文件*/ #include "sys_common.h" /*用户代码开始(1)*/ #include "spi.h" /*用户代码结束*/ *用户代码开始(2)*/ uint16 TX_Data_Master[16]={0x01、0x02、0x03、0x04、0x05、0x05、 0x06、0x07、0x08、0x09、0x0A、 0x0B、0x0C、0x0D、0x0E、0x0F、 0x10 }; /*用户代码结束*/ int main (void) { /*用户代码开始(3)*/ spiDAT1_t 数据通信 fig1_t; dataconfig1_t.CS_hold = false; dataconfig1_t.WDEL = true; dataconfig1_t.DFSEL = SPI_FMT_0; dataconfig1_t.CSNR = 0xFE; /*通过 CPSR 启用 CPU 中断*/ _enable_IRQ (); /*根据 GUI 配置初始化 SPI 模块 * SPI1 -主器件(SIMO、SOMI、CLK、CS0) * SPI3 -从器件(SIMO、SOMI、CLK、CS0) ***/ spiInit(); while (1){ /*通过轮询模式启动 SPI1发送*/ TransmitData (spiREG1、&dataconfig1_t、16、TX_Data_Master); } /*用户代码结束*/ 返回0; }//* 用户代码开始(4)*/* 用户代码结束*/
您好!
您为 dsPIC33选择了什么时钟边沿和时钟极性? 如果 dsPIC33要求在两次传输之间取消芯片选择的置位、则需要设置 CSHOLD=false。
微芯片也具有该位
SMP:SPIx 数据输入采样相位位
主控模式:1 =在数据输出时间结束时对输入数据进行采样0 =在数据输出时间的中间对输入数据进行采样
从机模式:当 SPIx 模块在从机模式下使用时、必须将 SMP 位清零。
时钟边沿= 0。 极性= 0。 并且 SMP = 0。 微芯片中
相位= 0。 Hercules 中的极性= 0
您的当前设置是否出现问题?
最好设置 clockedge=1 (下降沿)、请先尝试。
我发送了0xAAAA、0X5555的字阵列(在 halcogen 中设置的16位、相位0和极性0)、波特率为1000kHz
我在从缓冲 器0x48480x0484中收到。 (16位、SMP 0和极性0、时钟边沿1)
CS_HOLD (((从器件侧)在 整个16位传输中、从器件选择引脚必须保持有效。) 如果 从器 件不直接使用从器件选择信号本身、那么除了使能外设使用它之外、在传输之间执行什么 SS 也无关紧要。
/*用户代码结束*/ *包含文件*/ #include "sys_common.h" /*用户代码开始(1)*/ #include "spi.h" /*用户代码结束*/ *用户代码开始(2)*/ ///uint16 TX_Data_Master[16]={0x01、0x02、0x03、0x04、0x05、0x05、 0x06、0x07、0x08、0x09、0x0A、 0x0B、0x0C、0x0D、0x0E、0x0F、 0x10}; uint16 TX_Data_Master[2]={0xAAAA、0x5555}; //用户代码结束*/ int main (void) { //用户代码开始(3)*/ spiDAT1_t 数据通信 fig1_t; //片选信号在多个连续的数据字传输过程中持续保持有效 dataconfig1_t.CS_hold = false; /*事务后,相应数据格式的 WDELAY 将加载到延迟计数器中。 在 WDELAY 计数器溢出之前不会执行任何事务。 SPISCS 引脚将被禁用 至少(WDELAY+2)* VCLK_PERIOD 持续时间。 * dataconfig1_t.WDEL = false; //选择数据字格式0 dataconfig1_t.DFSEL = SPI_FMT_0; //芯片选择号码。 CSNR 定义了将在数据传输期间激活的芯片选择(在我们的情况下为0)。 dataconfig1_t.CSNR = 0xFE; /*通过 CPSR 启用 CPU 中断*// _enable_IRQ (); /*根据 GUI 配置初始化 SPI 模块 * SPI1 -主器件(SIMO、SOMI、CLK、CS0) * SPI3 -从器件(SIMO、SOMI、CLK、CS0) ***/ spiInit(); while (1) { /*通过轮询模式启动 SPI1发送*/ TransmitData (spiREG1、&dataconfig1_t、2、TX_Data_Master); //__delay_cycles (1000); } /*用户代码结束*/ 返回0; }//* 用户代码开始(4)*/* 用户代码结束*/
您是否尝试过时钟边沿0? 数据是否在 SPI 数据总线上正确发送?
对于极性= 0且相位= 0的 TMS570 SPI 时钟模式、数据在 SPICLK 的上升沿输出、输入数据在 SPICLK 的下降沿锁存。 因此、我期望从 SALve 侧的输入数据在 SPICLK 的上升沿锁存。
它现在的工作原理非常感谢。
现在、我想让 Hercules 成为正确编写代码的从器件
***************************************
* GUI 配置
***************************************
* 1)驱动程序选项卡
*-选择 SPI1
* 2) VIM 通道0-31
*-启用 MIBSPI1HIGH 和 MIBSPI1LOW 通道。
* 3) PINMUX 使能 MIBSPI1
*-禁用引脚105上的冲突 MIBSPI1SOMI_1
* 4) SPI1选项卡
*- SPI1全局子选项卡
*-取消选中主模式
*-取消选中"内部时钟"
*-启用 RXINT (高级)
5) SPI1数据格式
-budrate 1MHz、16位、极性0、相位0、
6) SPI1端口
启用 SIM0、SOMI0、CLK、CS[0]
#include "sys_common.h" #include "spi.h" uint16 RX_Data_Slave[16]={0}; int main (void) { spiDAT1_t 数据通信 fig1_t; dataconfig1_t.CS_hold = false; dataconfig1_t.WDEL = false; dataconfig1_t.DFSEL = SPI_FMT_0; dataconfig1_t.CSNR = 0xFE; _enable_IRQ (); spiInit(); GetspiData (spiREG1、&dataconfig1_t、4、RX_Data_Slave); while (1); 返回0; }
您好!
spiGetData()是在中断模式中使用的正确函数。 需要首先调用此函数、等待时钟和来自主器件的数据。