TMS320F28377D库函数操作(SPI初始化及使用)

目录

1.背景

2.基本知识

3.程序

4.结果

5.注意


 

 

1.背景

SPI作为常用的嵌入式总线之一在28377d中也有硬件,而且手册上给的是支持最高50Mhz的频率,说实话我以前只在传说中听过这个速率,希望TI没有虚假宣传吧(虽然知道是理论值

 

2.基本知识

和上两个文章一样,这里对SPI的发送过程,理论就不再赘述了,如果各位读者还要问题建议百度。大家如果第一次用TI的SPI的话可能找不到它的引脚,因为TI的对SPI的管脚都不是常见命名具体命名如下图

21fcb1fc192d4f629989d9bc5dffc67c.png

 

TI对SPI的模式也有四种预设模式,这里我就选择模式0来做实验了

ecd3720e231e468d9bfedb78fbbcbd0f.png

 

3.程序

void init_spi1(void)
{

        GPIO_setPinConfig(GPIO_16_SPISIMOA);
        GPIO_setPadConfig(16, GPIO_PIN_TYPE_STD);
        GPIO_setQualificationMode(16, GPIO_QUAL_ASYNC);

        GPIO_setPinConfig(GPIO_17_SPISOMIA);
        GPIO_setPadConfig(17, GPIO_PIN_TYPE_STD);
        GPIO_setQualificationMode(17, GPIO_QUAL_ASYNC);

        GPIO_setPinConfig(GPIO_18_SPICLKA);
        GPIO_setPadConfig(18, GPIO_PIN_TYPE_STD);
        GPIO_setQualificationMode(18, GPIO_QUAL_ASYNC);

        GPIO_setPinConfig(GPIO_19_SPISTEA);
        GPIO_setPadConfig(19, GPIO_PIN_TYPE_STD);
        GPIO_setQualificationMode(19, GPIO_QUAL_ASYNC);

//        GPIO_setPadConfig(19, GPIO_PIN_TYPE_PULLUP);    // Enable pullup on GPIO11
//        GPIO_setPinConfig(GPIO_19_GPIO19);              // GPIO11 = GPIO11
//        GPIO_setDirectionMode(19, GPIO_DIR_MODE_OUT);   // GPIO11 = output


        SPI_disableModule(SPIA_BASE);
        SPI_setConfig(SPIA_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0,
                      SPI_MODE_CONTROLLER, 500000, 16);
        SPI_setPTESignalPolarity(SPIA_BASE, SPI_PTE_ACTIVE_LOW);
        SPI_disableFIFO(SPIA_BASE);
        SPI_disableLoopback(SPIA_BASE);
        SPI_setEmulationMode(SPIA_BASE, SPI_EMULATION_FREE_RUN);
        SPI_enableModule(SPIA_BASE);
}

其中核心为这几句

SPI_setConfig(SPIA_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_POL0PHA0,
                      SPI_MODE_CONTROLLER, 500000, 16);

SPI_setEmulationMode(SPIA_BASE, SPI_EMULATION_FREE_RUN);

第一个函数的最后一位是传输位数,TI最大支持16位,我先以16位为例,这里有坑,一会再解释。倒数第二位是通信速率,我试过其他速率,貌似SPI就不工作了,很奇怪,大家如果试过其他速率也可以跟我说说。倒数第三个参数就是模式,就是上文提及的模式,这里我选择模式0。

 

第二个函数的第二个参数若跟随我所设置的就是常见的模式,还有其他几个参数我倒是没事过。

SPI_writeDataNonBlocking(SPIA_BASE, 5);

TI官方提供了这个函数来发送数据,第一个参数就是你所用到的SPI,第二位是你要发送的数据这里我就选择5了。

 

void main(void)
{
      init_CPU1();                        //初始化CPU1
//    CLA_init();                         //初始化CLA1
//
//    initCPUTimer0(100000);              //初始化timer0
//    initCPUTimer1(200000);              //初始化timer1
//    initCPUTimer2(100);                 //初始化timer2
//
//    EPWM_init();                        //初始化EPWM模块
//    initEPWM1();                        //初始化EPWM1
//    initEPWM_for_dac(EPWM8_BASE);       //初始化EPWM8给DACA
//
//    initDMA6_DAC();                     //初始化DMA6给DAC
//    initADC1();                         //初始化ADC1
//    start_epwm12_adc1();                //初始化EPWM12给adc1
//    initDACA();                         //初始化DACA
//    initDACC();                         //初始化DACC
//
//    init_uart1(115200);                 //初始化串口1
//    initI2C1();                     //初始化IIC1
    init_spi1();                    //初始化SPI1
//
//    Init_LEDV3();                       //初始化LEDV3管脚
//
    ENINT;                              //启用全局中断和实时中断
//    OLED4_Init();                       //4针IIC的oled初始化

//    CLA_runTest(1);                     //启动CLA任务1
//    CLA_runTest(2);
//    ESTOP0;                             //软件断点
//
//    for(fftmov=0;fftmov<520;fftmov++)
//    {
//        fftout[fftmov]=fabsf(IOBuffer[fftmov]);
//        __asm(" NOP");
//    }

//    ESTOP0;                             //软件断点

    while(1)
    {
        SPI_writeDataNonBlocking(SPIA_BASE, 5);
        ;
    }
}

这是主函数没啥好说的。

 

4.结果

93d3896327ea45c5b7281d0ca162a830.jpg

54484fc0987c4caca21093ef3804bc45.jpg

1fac655c138f4a65a43c08b93b10a552.jpg

 效果看上去还不错

 

5.注意

若是你将16改为8位你就会发现不对了

c8f9ab678bc44979a47cc8fe4dd53aea.jpg

 呀?数据位呢?程序错了吗?那为什么还有时钟信号?

 

这里就要说明了,ti内部数据位是左对齐的

82eb76b81d4641e9901d619fe7144534.png

 等于说在8位模式下低8位全部被抹除所以是没有的

 

所以我们此时要输入1280

fbe01106758b411b8d98b67d2653e597.png

 69e490e54c8348bca1e7347b9a91e120.png

 5d5d7323911f4319be0857542885061b.jpg

 这下输出就正常了

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值