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.

[参考译文] TMS470MF06607:tms470mf06607 SPI chip_s促 启用和禁用

Guru**** 2465890 points
Other Parts Discussed in Thread: TMS470MF06607, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/663835/tms470mf06607-tms470mf06607-spi-chip_selects-enabling-and-disabling

器件型号:TMS470MF06607
主题中讨论的其他器件: HALCOGEN

您好!

我使用 HALCOGEN 为 TMS470MF06607生成 SPI 代码。 生成代码后、我将使用 CCS 将代码刷写到 TMS470MF06607 lanchpad 中。

但我面临芯片选择问题、这里的芯片选择是自动启用和禁用的。

我需要知道如何 在需要时启用和禁用芯片选择。

请帮助解决此问题、在此我附上了代码、请检查。

**在这里,我在主模式下启用了 SPI。

谢谢。  

//spi.c

#include "spi.h"


void spiInit (void)

sint32 i;

/**@b 初始化@b MIBSPI1 */

/**使 SPI 退出复位*/
spiREG1->GCR0 = 1U;

/**启用 MIBSPI1多缓冲模式并启用缓冲 RAM */
spiREG1->MIBSPIE =(spiREG1->MIBSPIE & 0xFFFFFFFEU)| 1U;

/** MIBSPI1主模式和时钟配置*/
spiREG1->GCR1 =(spiREG1->GCR1 & 0xFFFFFFFCU)|(1U << 1U)/* CLOKMOD */
| 1U);/*主设备*/

/** MIBSPI1使能引脚配置*/
spiREG1->INT0 =(spiREG1->INT0 & 0xFEFFFFFFU)|(0U <<24U);//启用 HIGHZ */

/**-延迟*/
spiREG1->delay =(2U <<24U)/* C2TDELAY */
|(2U <<16U)/* T2CDELAY */
|(0U << 8U)/* T2EDELAY */
|0U;/* C2EDELAY */

/**-数据格式0 */
spiREG1->FMT0 =(2U <<24U)/* wdelay */
|(0U << 23U)/*奇偶极性*/
|(0U << 22U)/*奇偶校验使能*/
|(0U << 21U)//等待启用
|(0U << 20U)/*换向*/
|(0U << 17U)/*时钟极性*/
|(0U << 16U)/*时钟相位*/
|(79U << 8U)/*波特率预分频*
|8U;/*数据字长度*/

/**-数据格式1 */
spiREG1->FMT1 =(2U <<24U)/* wdelay */
|(0U << 23U)/*奇偶极性*/
|(0U << 22U)/*奇偶校验使能*/
|(0U << 21U)//等待启用
|(0U << 20U)/*换向*/
|(0U << 17U)/*时钟极性*/
|(0U << 16U)/*时钟相位*/
|(79U << 8U)/*波特率预分频*
|8U;/*数据字长度*/

/**-数据格式2 */
spiREG1->FMT2 =(2U <<24U)/* wdelay */
|(0U << 23U)/*奇偶极性*/
|(0U << 22U)/*奇偶校验使能*/
|(0U << 21U)//等待启用
|(0U << 20U)/*换向*/
|(0U << 17U)/*时钟极性*/
|(0U << 16U)/*时钟相位*/
|(79U << 8U)/*波特率预分频*
|8U;/*数据字长度*/

/**-数据格式3 */
spiREG1->FMT3 =(2U <<24U)/* wdelay */
|(0U << 23U)/*奇偶极性*/
|(0U << 22U)/*奇偶校验使能*/
|(0U << 21U)//等待启用
|(0U << 20U)/*换向*/
|(0U << 17U)/*时钟极性*/
|(0U << 16U)/*时钟相位*/
|(79U << 8U)/*波特率预分频*
|8U;/*数据字长度*/

/**-在访问 MibSPI 寄存器之前等待缓冲器初始化完成*/
while ((spiREG1->FLG & 0x01000000U)!= 0U)  
{  
}/*等待*/

/**-初始化传输组*/
spiREG1->TGCTRL[0U]=(1U << 30U)/* OneShot *
|(0U << 29U)/*当前复位*/
|(TRG_Always << 20U)/*触发事件*/
|(TRG_DISABLED << 16U)/*触发源*/
|(0U << 8U);/*启动缓冲器*/

spiREG1->TGCTRL[1U]=(1U << 30U)/* OneShot */
|(0U << 29U)/*当前复位*/
|(TRG_Always << 20U)/*触发事件*/
|(TRG_DISABLED << 16U)/*触发源*/
|(8U << 8U);/*启动缓冲器*/

spiREG1->TGCTRL[2U]=(1U <<30U)/* OneShot */
|(0U << 29U)/*当前复位*/
|(TRG_Always << 20U)/*触发事件*/
|(TRG_DISABLED << 16U)/*触发源*/
|((8U+8U)<< 8U);/*启动缓冲器*/

spiREG1->TGCTRL[3U]=(1U << 30U)/* OneShot *
|(0U << 29U)/*当前复位*/
|(TRG_Always << 20U)/*触发事件*/
|(TRG_DISABLED << 16U)/*触发源*/
|((8U+8U+8U)<< 8U);/*启动缓冲器*/

spiREG1->TGCTRL[4U]=(1U <<30U)/* OneShot */
|(0U << 29U)/*当前复位*/
|(TRG_Always << 20U)/*触发事件*/
|(TRG_DISABLED << 16U)/*触发源*/
|((8U+8U+8U+8U)<<8U);/*启动缓冲器*/

spiREG1->TGCTRL[5U]=(1U << 30U)/* OneShot *
|(0U << 29U)/*当前复位*/
|(TRG_Always << 20U)/*触发事件*/
|(TRG_DISABLED << 16U)/*触发源*/
|((8U+8U+8U+8U+8U+8U)<<8U);/*启动缓冲器*/

spiREG1->TGCTRL[6U]=(1U << 30U)/* OneShot *
|(0U << 29U)/*当前复位*/
|(TRG_Always << 20U)/*触发事件*/
|(TRG_DISABLED << 16U)/*触发源*/
|((8U+8U+8U+8U+8U+8U+8U)<<8U);//开始缓冲区

spiREG1->TGCTRL[7U]=(1U << 30U)/* OneShot *
|(0U << 29U)/*当前复位*/
|(TRG_Always << 20U)/*触发事件*/
|(TRG_DISABLED << 16U)/*触发源*/
|((8U+8U+8U+8U+8U+8U+8U+8U+8U)<<8U);/*启动缓冲器*/

spiREG1->TGCTRL[8U]=(1U << 30U)/* OneShot *
|(0U << 29U)/*当前复位*/
|(TRG_Always << 20U)/*触发事件*/
|(TRG_DISABLED << 16U)/*触发源*/
|((8U+8U+8U+8U+8U+8U+8U+8U+8U+8)<<8U);/*启动缓冲器*/

spiREG1->TGCTRL[9U]=(1U << 30U)/* OneShot *
|(0U << 29U)/*当前复位*/
|(TRG_Always << 20U)/*触发事件*/
|(TRG_DISABLED << 16U)/*触发源*/
|((8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+0)<<8U);/*启动缓冲器*/

spiREG1->TGCTRL[10U]=(1U << 30U)/* OneShot *
|(0U << 29U)/*当前复位*/
|(TRG_Always << 20U)/*触发事件*/
|(TRG_DISABLED << 16U)/*触发源*/
|((8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+0U+0)<<8U);/*启动缓冲器*/

spiREG1->TGCTRL[11U]=(1U << 30U)/* OneShot *
|(0U << 29U)/*当前复位*/
|(TRG_Always << 20U)/*触发事件*/
|(TRG_DISABLED << 16U)/*触发源*/
|((8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+0U+0)<<8U);/*启动缓冲器*/

spiREG1->TGCTRL[12U]=(1U << 30U)/* OneShot *
|(0U << 29U)/*当前复位*/
|(TRG_Always << 20U)/*触发事件*/
|(TRG_DISABLED << 16U)/*触发源*/
|((8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+0U+0U+0U+0)<<8U);//开始缓冲区

spiREG1->TGCTRL[13U]=(1U << 30U)/* OneShot *
|(0U << 29U)/*当前复位*/
|(TRG_Always << 20U)/*触发事件*/
|(TRG_DISABLED << 16U)/*触发源*/
|((8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+0U+0U+0U+0U+0U+0)<<8U);/*启动缓冲器*/

spiREG1->TGCTRL[14U]=(1U << 30U)/* OneShot *
|(0U << 29U)/*当前复位*/
|(TRG_Always << 20U)/*触发事件*/
|(TRG_DISABLED << 16U)/*触发源*/
|((8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+0U+0U+0U+0U+0U+0U+0)<<8U);/*启动缓冲器*/

spiREG1->TGCTRL[15U]=(1U << 30U)/* OneShot */
|(0U << 29U)/*当前复位*/
|(TRG_Always << 20U)/*触发事件*/
|(TRG_DISABLED << 16U)/*触发源*/
|((8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+0U+0U+0U+0U+0U+0U+0U+0)<<8U);/*启动缓冲器*/


spiREG1->LTGPEND =(spiREG1->LTGPEND & 0xFFFF00FFU)|((8U+8U+8U+8U+8U+8U+8U+8U+8U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U+0U+1U-)-1U);

/**-初始化缓冲区 RAM */
{  
I = 0U;
如果(8U > 0U)

while (I <(8U-1U))

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(1U <<12U)/*芯片选择保持*/
|(0U << 11U)/*锁定传输*/
|(0U << 8U)/*数据格式*/
| CS_0;/*芯片选择*/

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(0U << 12U)//对于最后一个缓冲区,芯片选择保持必须为零
|(1U <<10U)/*启用 WDELAY */
|(0U << 8U)/*数据格式*/
| CS_0;/*芯片选择*/

如果(8U > 0U)

while (I <((8U+8U)-1U))

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(1U <<12U)/*芯片选择保持*/
|(0U << 11U)/*锁定传输*/
|(0U << 8U)/*数据格式*/
| CS_1;/*芯片选择*/

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(0U << 12U)//对于最后一个缓冲区,芯片选择保持必须为零
|(1U <<10U)/*启用 WDELAY */
|(0U << 8U)/*数据格式*/
| CS_1;/*芯片选择*/

如果(8U > 0U)

while (I <(8U+8U+8U)-1U)

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(1U <<12U)/*芯片选择保持*/
|(0U << 11U)/*锁定传输*/
|(0U << 8U)/*数据格式*/
| CS_2;/*芯片选择*/

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(0U << 12U)//对于最后一个缓冲区,芯片选择保持必须为零
|(1U <<10U)/*启用 WDELAY */
|(0U << 8U)/*数据格式*/
| CS_2;/*芯片选择*/

如果(8U > 0U)

while (I <(8U+8U+8U+8U)-1U)

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(1U <<12U)/*芯片选择保持*/
|(0U << 11U)/*锁定传输*/
|(0U << 8U)/*数据格式*/
| CS_3;/*芯片选择*/

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(0U << 12U)//对于最后一个缓冲区,芯片选择保持必须为零
|(1U <<10U)/*启用 WDELAY */
|(0U << 8U)/*数据格式*/
| CS_3;/*芯片选择*/

如果(8U > 0U)

while (I <(8U+8U+8U+8U+8U+8U)-1U)

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(1U <<12U)/*芯片选择保持*/
|(0U << 11U)/*锁定传输*/
|(0U << 8U)/*数据格式*/
| CS_4;/*芯片选择*/

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(0U << 12U)//对于最后一个缓冲区,芯片选择保持必须为零
|(1U <<10U)/*启用 WDELAY */
|(0U << 8U)/*数据格式*/
| CS_4;/*芯片选择*/

如果(8U > 0U)

while (I <((8U+8U+8U+8U+8U+8U+8U+8U)-1U))

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(1U <<12U)/*芯片选择保持*/
|(0U << 11U)/*锁定传输*/
|(0U << 8U)/*数据格式*/
| CS_5;/*芯片选择*/

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(0U << 12U)//对于最后一个缓冲区,芯片选择保持必须为零
|(1U <<10U)/*启用 WDELAY */
|(0U << 8U)/*数据格式*/
| CS_5;/*芯片选择*/

如果(8U > 0U)

while (I <((8U+8U+8U+8U+8U+8U+8U+8U+8U)-1U))

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(1U <<12U)/*芯片选择保持*/
|(0U << 11U)/*锁定传输*/
|(0U << 8U)/*数据格式*/
| CS_6;/*芯片选择*/

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(0U << 12U)//对于最后一个缓冲区,芯片选择保持必须为零
|(1U <<10U)/*启用 WDELAY */
|(0U << 8U)/*数据格式*/
| CS_6;/*芯片选择*/

如果(8U > 0U)

while (I <((8U+8U+8U+8U+8U+8U+8U+8U+8U+8U)-1U))

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(1U <<12U)/*芯片选择保持*/
|(0U << 11U)/*锁定传输*/
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(0U << 12U)//对于最后一个缓冲区,芯片选择保持必须为零
|(1U <<10U)/*启用 WDELAY */
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

如果(0 > 0U)

while (I <(8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+0U)-1U))

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(1U <<12U)/*芯片选择保持*/
|(0U << 11U)/*锁定传输*/
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(0U << 12U)//对于最后一个缓冲区,芯片选择保持必须为零
|(0U << 10U)/*启用 WDELAY */
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

如果(0U > 0U)

while (I <((8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+0U)-1U))

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(1U <<12U)/*芯片选择保持*/
|(0U << 11U)/*锁定传输*/
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(0U << 12U)//对于最后一个缓冲区,芯片选择保持必须为零
|(0U << 10U)/*启用 WDELAY */
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

如果(0U > 0U)

while (I <((8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+0U+0U)-1U))

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(1U <<12U)/*芯片选择保持*/
|(0U << 11U)/*锁定传输*/
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(0U << 12U)//对于最后一个缓冲区,芯片选择保持必须为零
|(0U << 10U)/*启用 WDELAY */
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

如果(0U > 0U)

while (I <((8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+0U+0U)-1U))

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(1U <<12U)/*芯片选择保持*/
|(0U << 11U)/*锁定传输*/
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(0U << 12U)//对于最后一个缓冲区,芯片选择保持必须为零
|(0U << 10U)/*启用 WDELAY */
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

如果(0U > 0U)

while (I <((8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+0U+0U+0U+0U)-1U))

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(1U <<12U)/*芯片选择保持*/
|(0U << 11U)/*锁定传输*/
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(0U << 12U)//对于最后一个缓冲区,芯片选择保持必须为零
|(0U << 10U)/*启用 WDELAY */
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

如果(0U > 0U)

while (I <(8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+0U+0U+0U+0U+0U+0U+0U+0U)-1U))

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(1U <<12U)/*芯片选择保持*/
|(0U << 11U)/*锁定传输*/
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(0U << 12U)//对于最后一个缓冲区,芯片选择保持必须为零
|(0U << 10U)/*启用 WDELAY */
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

如果(0U > 0U)

while (I <((8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+0U+0U+0U+0U+0U+0U+0U+0U)-1U)))

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(1U <<12U)/*芯片选择保持*/
|(0U << 11U)/*锁定传输*/
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(0U << 12U)//对于最后一个缓冲区,芯片选择保持必须为零
|(0U << 10U)/*启用 WDELAY */
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

如果(0U > 0U)

while (I <((8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+8U+0U+0U+0U+0U+0U+0U+0U+0U+0U)-1U)))

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(1U <<12U)/*芯片选择保持*/
|(0U << 11U)/*锁定传输*/
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

spiRAM1->TX[i++].control =(4U << 13U)/*缓冲模式*/
|(0U << 12U)//对于最后一个缓冲区,芯片选择保持必须为零
|(0U << 10U)/*启用 WDELAY */
|(0U << 8U)/*数据格式*/
| CS_7;/*芯片选择*/

/**-设置中断级别*/
spiREG1->LVL =(0U <<9U)/* TXINT */
|(0U << 8U)/* RXINT */
|(0U << 6U)/* OVRNINT */
|(0U << 4U)/* BITERR */
|(0U << 3U)/* DESYNC */
|(0U << 2U)/* PARERR */
|(0U << 1U)/*超时*/
|(0U);/* DLENERR */

/**-清除所有挂起的中断*/
spiREG1->FLG |= 0xFFFFFFU;

/**-启用中断*/
spiREG1->INT0 =(spiREG1->INT0 & 0xFFFFFF0000U)
|(0U << 9U)/* TXINT */
|(0U << 8U)/* RXINT */
|(0U << 6U)/* OVRNINT */
|(0U << 4U)/* BITERR */
|(0U << 3U)/* DESYNC */
|(0U << 2U)/* PARERR */
|(0U << 1U)/*超时*/
|(0U);/* DLENERR */

/**@b 初始化@b MIBSPI1 @b 端口*/

/**- MIBSPI1端口输出值*/
spiREG1->PCDOUT = 1U /* SCS[0]*/
|(1U << 1U)/* SCS[1]*/
|(1U <<2U)/* SCS[2]*/
|(1U << 3U)/* SCS[3]*/
|(1U << 4U)/* SCS[4]*/
|(1U <<5U)/* SCS[5]*/
|(1U <<6U)/* SCS[6]*/
|(1U <<7U)/* SCS[7]*/
|(0U << 9U)/* CLK */
|(0U <<10U)/* SIMO */
|(0U << 11U);/* SOMI */

/**- MIBSPI1端口方向*/
spiREG1->PCDIR = 1U /* SCS[0]*/
|(1U << 1U)/* SCS[1]*/
|(1U <<2U)/* SCS[2]*/
|(1U << 3U)/* SCS[3]*/
|(0U <<4U)/* SCS[4]*/
|(1U <<5U)/* SCS[5]*/
|(1U <<6U)/* SCS[6]*/
|(0U << 7U)/* SCS[7]*/
|(1U <<9U)/* CLK */
|(1U <<10U)/* SIMO */
|(0U << 11U);/* SOMI */

/**- MIBSPI1端口开漏使能*/
spiREG1->PCPDR = 0U /* SCS[0]*/
|(0U << 1U)/* SCS[1]*/
|(0U <<2U)/* SCS[2]*/
|(0U << 3U)/* SCS[3]*/
|(0U <<4U)/* SCS[4]*/
|(0U << 5U)/* SCS[5]*/
|(0U << 6U)/* SCS[6]*/
|(0U << 7U)/* SCS[7]*/
|(0U << 9U)/* CLK */
|(0U <<10U)/* SIMO */
|(0U << 11U);/* SOMI */

/**- MIBSPI1端口上拉/下拉选择*/
spiREG1->PCPSL = 1U /* SCS[0]*/
|(1U << 1U)/* SCS[1]*/
|(1U <<2U)/* SCS[2]*/
|(1U << 3U)/* SCS[3]*/
|(1U << 4U)/* SCS[4]*/
|(1U <<5U)/* SCS[5]*/
|(1U <<6U)/* SCS[6]*/
|(1U <<7U)/* SCS[7]*/
|(1U <<9U)/* CLK */
|(1U <<10U)/* SIMO */
|(1U << 11U);/* SOMI */

/**- MIBSPI1端口上拉/下拉使能*/
spiREG1->PCDIS = 0U /* SCS[0]*/
|(0U << 1U)/* SCS[1]*/
|(0U <<2U)/* SCS[2]*/
|(0U << 3U)/* SCS[3]*/
|(0U <<4U)/* SCS[4]*/
|(0U << 5U)/* SCS[5]*/
|(0U << 6U)/* SCS[6]*/
|(0U << 7U)/* SCS[7]*/
|(0U << 9U)/* CLK */
|(0U <<10U)/* SIMO */
|(0U << 11U);/* SOMI */

/* MIBSPI1将所有引脚设置为功能*/
spiREG1->PCFUN = 1U /* SCS[0]*/
|(1U << 1U)/* SCS[1]*/
|(1U <<2U)/* SCS[2]*/
|(1U << 3U)/* SCS[3]*/
|(1U << 4U)/* SCS[4]*/
|(1U <<5U)/* SCS[5]*/
|(1U <<6U)/* SCS[6]*/
|(1U <<7U)/* SCS[7]*/
|(1U <<9U)/* CLK */
|(1U <<10U)/* SIMO */
|(1U << 11U);/* SOMI */

/**-最后启动 MIBSPI1 */
spiREG1->GCR1 =(spiREG1->GCR1 & 0xFEFFFFFFU)|(1U << 24U);

void spiSetData (spiBASE-t * SPI、uint32组、uint16 *数据)

spiRAM_t *ram = SPI => spiREG1? spiRAM1:spiRAM2;
uint32 start =(SPI->TGCTRL[组]>> 8U)& 0xFFU;
uint32 end = group ==7U? ((((SPI->LTGPEND & 0x0000EF00U)>>8U)+ 1U):((SPI->TGCTRL[group+1U]>> 8U)和0xFFU);

如果(结束<开始){结束= 128U;}

while (开始<结束)

RAM->TX[start].data =*数据++;
Start++;

/*用户代码开始(0)*/
/*用户代码结束*/

void spiEnableGroupNotification (spiBASE-t * SPI、uint32组、uint32级别)

if (级别!= 0U)

SPI->TGITLVST =(SPI->TGITLVST & 0x0000FFFFU)|((1U <<组)<< 16U);

其他

SPI->TGITLVCR =(SPI->TGITLVCR & 0x0000FFFFU)|((1U <<组)<< 16U);

SPI->TGITENST =(SPI->TGITENST & 0x0000FFFFU)|((1U <<组)<< 16U);

void spiTransfer (spiBASE-t * SPI、uint32组)

SPI->TGCTRL[组]|= 0x80000000U;

int main()

rtiInit();
spiInit();
gioInit();
hetInit();
gioSetDirection (gioPORTA、0xFFFFFFFF);
gioSetDirection (hetPORT、0xFFFFFFFF);
rtiEnableNotification (rtiNOTIFICATION_COMPARE0);
//_enable_IRQ ();
rtiStartCounter (rtiCOUNTER_BLOCK0);
EDGE =低电平;

//spiEnableGroupNotification (spiREG1,0、0);
spiEnableGroupNotification (spiREG1,0、0);
spiEnableGroupNotification (spiREG1,1,1,0);
spiEnableGroupNotification (spiREG1、2、0);
spiEnableGroupNotification (spiREG1,3,0);
spiEnableGroupNotification (spiREG1,4,0);
spiEnableGroupNotification (spiREG1,5,0);
spiEnableGroupNotification (spiREG1,6,0);
spiEnableGroupNotification (spiREG1,7,0);
SetspiData (spiREG1、0、TG0_TX_DATA);
SetspiData (spiREG1、1、TG0_TX_DATA);
SetspiData (spiREG1、2、TG0_TX_DATA);
SetspiData (spiREG1、3、TG0_TX_DATA);
SetspiData (spiREG1、4、TG0_TX_DATA);
SetspiData (spiREG1、5、TG0_TX_DATA);
SetspiData (spiREG1、6、TG0_TX_DATA);
SetspiData (spiREG1、7、TG0_TX_DATA);
while (1)

spiTransfer (spiREG1、0);
spiTransfer (spiREG1,1);
spiTransfer (spiREG1、2);
spiTransfer (spiREG1、3);
spiTransfer (spiREG1,4);
spiTransfer (spiREG1,5);
spiTransfer (spiREG1,6);
spiTransfer (spiREG1,7);

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

    在 SPI 传输期间、SPIDAT1寄存器的片选控制字段 CSNR[7:0]的值在 SPI_CS 引脚上驱动。 传输完成后、默认的 CS 值(由 csdef 寄存器定义)将放置在 SPI_CS 引脚上。

    如果要手动控制从器件的芯片选择、可以将 CS 引脚配置为 GIO、然后手动设置和清除此引脚。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、QJ Wang、
    我已经尝试过这种方法、这意味着我已经为芯片选择配置了一个 GIO4、但该数据不会发送到从器件。

    我使用 Arduino Uno 板作为从属设备、与 tms470mf06607 (主设备)和 Arduino uno (从设备)通信。
    在这种情况下、主器件侧 GIO4启用、SPI1启用、该 GIO4连接到该 Arduino uno 的芯片选择、但数据不发送。
    我要添加 Arduino uno 和 TMS470主要功能的主要功能、请找到问题所在

    感谢您的进步

    //TMS470主设备

    while (1)

    gioSetBit (gioPORTA、4、1);
    //spiREG1->PCSET =((spiREG1->PCSET)& 0xFFFFFFFF);// 1U;
    //
    //// spiREG1->PCSET =((spiREG1->PCSET)| 2U);//1U
    spiTransfer (spiREG1、0);
    //// spiREG1->PCCLR =((spiREG1->PCCLR)| 2U);// 0U;
    //
    /////spiREG1->PCSET =((spiREG1->PCSET)& 0xFFFFFFFE);// 1U;
    //gioSetBit (spiREG1->PCSET、0、1);
    gioSetBit (gioPORTA、4、0);




    #include
    #define 缓冲器_LEN 8.
    字节缓冲区[buff _LEN];
    字节缓冲区[buff _LEN]{9、8、7、6、5、4、3、2};
    volatile int pos = 0;
    volatile boolean process_it = false;
    int num = 0;
    //PIN 13 -> SCK
    //PIN 12 -> MISO
    //PIN 11 --> MOSI
    //PIN 10 -> SS

    void setup()

    ////设置 CS 方向
    //
    //pinMode (CS、输出);
    ////初始化 SPI
    SPI.begin();

    Serial.begin(9600);
    serial.println ("SPI test");
    引脚模式(MISO、输出);
    digitalWrite (miso,low);



    //SPCR 是 SPI 控制寄存器
    SPCR |=_BV (SPE);//SPE --> SPI 使能
    SPCR |=_BV (SPIE);//SPIE -> SPI 中断使能//SPI.attachInterrupt ();

    //ISP -->中断服务例程
    //SPI_STC_vect -> SPI 传输完成矢量中断
    ISR (SPI_STC_vect)

    字节 c = SPDR;//SPI 数据寄存器
    if (pos < sizeof (buff))

    buff [pos++]= c;
    //Serial.println ("buff ["+ String (pos)+"]:"+ String (buff [pos])+".");
    如果(c = 1)

    process_it = true;




    void loop()


    if (proc_it)

    for (int i=i;<pos;i++) 0

    serial.println ("buff ["+ String (i)+"]:"+ String (buff [i])+".");

    serial.println ("打印数据"+字符串(num++));


    POS = 0;
    process_it = false;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在这里、我写了一个示例供您参考:


    /*启用/禁用 SPI 芯片选择*/
    void spi_sel (unsigned long sel){
    如果(sel){
    spiREG1->PCDOUT |= 0x01; // CS[0]=高电平;CS[0]引脚配置为 GIO
    }否则{
    spiREG1->PCDOUT &=~0x01;// CS[0]=低电平




    /*在 SPI 接口上写入和读取一个字节*/
    unsigned char SPI_send (unsigned char outb){
    while ((spiREG1->FLG & 0x0200)=0);//等待 TXINTFLG 设置为之前的传输
    spiREG1->DAT1 = outb | 0x100D0000;//发送寄存器地址

    while ((spiREG1->FLG & 0x0100)=0); //等待 RXINTFLG 在接收到新值时被置位
    return (unsigned char) spiREG1->BUF);//返回接收到的值
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 、QJ Wang

    没有使用上述示例、我尝试过该示例、但没有传输、并且芯片选择不切换。

    谢谢你。