目录
1.背景
SPI作为常用的嵌入式总线之一在28377d中也有硬件,而且手册上给的是支持最高50Mhz的频率,说实话我以前只在传说中听过这个速率,希望TI没有虚假宣传吧(虽然知道是理论值)
2.基本知识
和上两个文章一样,这里对SPI的发送过程,理论就不再赘述了,如果各位读者还要问题建议百度。大家如果第一次用TI的SPI的话可能找不到它的引脚,因为TI的对SPI的管脚都不是常见命名具体命名如下图
TI对SPI的模式也有四种预设模式,这里我就选择模式0来做实验了
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.结果
效果看上去还不错
5.注意
若是你将16改为8位你就会发现不对了
呀?数据位呢?程序错了吗?那为什么还有时钟信号?
这里就要说明了,ti内部数据位是左对齐的
等于说在8位模式下低8位全部被抹除所以是没有的
所以我们此时要输入1280
这下输出就正常了