TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

该讨论已被锁定。
您不能再向该讨论中发布新回复。如果您有问题可以开始新讨论

[参考译文] TMS320F28335-SPI-Master 和 TMS320F28335-SPI-Slave 之间的通信

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/948327/communication-between-tms320f28335-spi-master-and-tms320f28335-spi-slave

器件型号:TMS320F28335
主题中讨论的其他器件: C2000WARE

您好!

我尝试在两个 TMS320F28335微控制器之间进行通信。 一个配置为主器件、另一个配置为从器件。

当我从主器件向从器件发送数据时、我会按预期从器件返回两个字节的数据。 然后、我得到两个字节的数据、这不是预期的那样。 我从主器件发送到从器件的数据似乎只是存储在 SPIDAT 中、并随着主器件到从器件的下一次数据传输而移出。

相反、我希望从器件将下一个数据从 TXBUF 写入 SPIDAT、并在下一次通信时发送该数据。

随附的内容发送通信屏幕截图以及主从配置代码。 通道1是主器件、通道2是从器件。

提前感谢!

主配置:

int16 init_pins_as spi_master (uint16波特率){
EALLOW;
TMC_BASE_PIO->CTL[0].PUD &=~((UINT32) 0x1<<16); //在 GPIO16 (SPISIMOA)
上启用上拉 TMC_BASE_PIO->CTL[0].QSEL2 |=(0x3); //异步输入 GPIO16 (SPISIMOA)
TMC_BAS_PIO->CTL[0].MUX2 |=(0x1); //将 GPIO16配置为 SPISIMOA

TMC_BASE_PIO->CTL[0].PUD &=~((UINT32) 0x1<<17); //启用 GPIO17 (SPISOMIA)
TMC_BASE_PIO->CTL[0].QSEL2 |=(0x3<<2); //异步输入 GPIO17 (SPISOMA)
TMC_BAS_PIO->CTL[0].MUX2 |=(0x1<<2); //将 GPIO17配置为 SPISOMIA

TMC_BASE_PIO->CTL[0].PUD &=~((UINT32) 0x1<<18); GPIO18上的//使能上拉电阻(SPICLKA)
TMC_BASE_PIO->CTL[0].QSEL2 |=((uint32) 0x3<<4); //异步输入 GPIO18 (SPICLKA)
TMC_BASE_PIO->CTL[0].MUX2 |=((uint32) 0x1<<4); //将 GPIO18配置为 SPICLKA

TMC_BASE_PIO->CTL[0].PUD &=~((UINT32) 0x1<<19); GPIO19上的//使能上拉电阻(SPISTEA)
TMC_BASE_PIO->CTL[0].QSEL2 |=((uint32) 0x3<<6); //异步输入 GPIO19 (SPISTEA)
TMC_BASE_PIO->CTL[0].MUX2 |=((uint32) 0x1<<6); //将 GPIO19配置为 SPISTEA
EDIS;

//在复位中设置
TMC_BAS_SPIA->CCR &&μ~(0x1<<7);

//启用主控模式、正常阶段、启用通话和禁用 SPI int。
TMC_BASE_SPIA->CTL |= 0x0006;//启用主模式和传输
TMC_BASE_SPIA->BRR |=波特率;
TMC_BAS_SPIA->CCR |= 0x00F;// 16位字

//初始化 SPI FIFO 寄存器
TMC_BASE_SPIA->FFRX &=~(0x1F); //接收
TMC_BASE_SPIA->FFRX |=(0x1); //////将 RX FIFO 深度设置为8
TMC_BASE_SPIA->FFRX |=(0x1<<5);//启用中断
TMC_BASE_SPIA->FFRX |=(0x1<<6);//清除中断标志
TMC_BASE_SPIA->FFRX |=(0x1<<13);//重新启用接收 FIFO 操作

TMC_BASE_SPIA->FFTX |=(0x1); //将 TX FIFO 级别设置为8
TMC_BASE_SPIA->FFTX |=(0x1<<5);//启用中断
TMC_BASE_SPIA->FFTX |=(0x1<<6);//清除中断标志
TMC_BASE_SPIA->FFTX |=(0x1<<13);//从复位状态释放 FIFO
TMC_BASE_SPIA->FFTX |=(0x1<<14);//启用 FIFO 增强功能
TMC_BASE_SPIA->FFTX |=((uint32) 0x1<<15);// SPI FIFO 恢复

//Out of Reset
TMC_BASE_SPIA->CCR |=(0x1<<7);//从复位中撤回 SPI 并设置字符长度

返回0;
}


uint16 data=0;
int main (void)
{
uint32 i=0;

set_system_controls();
INIT_PINS_AS_SPI_MASTER (0x0063);

while (1){
SPI_Send (0x8888);
SPI_READ (&data);
}

返回0;
}


void SPI_Send (uint16 data){
TMC_BASE_SPIA->TXBUF=数据;
TMC_BASE_SPIA->FFTX |=(0x1<<6);//清除中断标志

}

void SPI_Read (uint16 *数据){
*数据= TMC_BASE_SPIA->RXBUF;
TMC_BASE_SPIA->FFRX |=(0x1<<6);//清除中断标志

}


________________________________________________________________

从器件配置:


int16 init_pins_as spi_slave (){
   EALLOW;
   TMC_BASE_PIO->CTL[0].PUD &=~((uint32) 0x1<<16);      //启用 GPIO16上的上拉(SPISIMOA)
            TMC_BASE_PIO->CTL[0].QSEL2 |=(0x3);      //异步输入 GPIO16 (SPISIMOA)
            TMC_BASE_PIO->CTL[0].MUX2 |=(0x1);         //将 GPIO16配置为 SPISIMOA

            TMC_BASE_PIO->CTL[0].PUD &=~((uint32) 0x1<<17);      //启用 GPIO17上的上拉电阻器(SPISOMIA)
            TMC_BASE_PIO->CTL[0].QSEL2 |=(0x3<2);      //异步输入 GPIO17 (SPISOMIA)
            TMC_BASE_PIO->CTL[0].MUX2 |=(0x1<<2);      //将 GPIO17配置为 SPISOMIA

            TMC_BASE_PIO->CTL[0].PUD &=~((uint32) 0x1<<18);      //启用 GPIO18上的上拉电阻器(SPICLKA)
            TMC_BASE_PIO->CTL[0].QSEL2 |=((uint32) 0x3<<4);      //异步输入 GPIO18 (SPICLKA)
            TMC_BASE_PIO->CTL[0].MUX2 |=((uint32) 0x1<<4);      //将 GPIO18配置为 SPICLKA

            TMC_BASE_PIO->CTL[0].PUD &=~((uint32) 0x1<<19);      //启用 GPIO19上的上拉(SPISTEA)
            TMC_BASE_PIO->CTL[0].QSEL2 |=((uint32) 0x3<<6);      //异步输入 GPIO19 (SPISTEA)
            TMC_BASE_PIO->CTL[0].MUX2 |=((uint32) 0x1<<6);      //将 GPIO19配置为 SPISTEA
   EDIS;

   //在复位中设置
   TMC_BAS_SPIA->CCR &&μ~(0x1<<7);

   //启用从设备
   TMC_BASE_SPIA->CTL &=~(0x0004);   //禁用主控模式
   TMC_BASE_SPIA->CTL |=(0x2);      //启用传输
   TMC_BASE_SPIA->CTL |=(0x1);   //启用中断
   TMC_BAS_SPIA->CCR |= 0x00F;  // 16位字


   //初始化 SPI FIFO 寄存器
   TMC_BASE_SPIA->FFRX &=~(0x1F);      //接收
   TMC_BASE_SPIA->FFRX |=(0x1);      ////将 RX FIFO 级别设置为8
   TMC_BASE_SPIA->FFRX |=(0x1<<5);   //启用中断
   TMC_BASE_SPIA->FFRX |=(0x1<<6);   //清除中断标志
   TMC_BASE_SPIA->FFRX |=(0x1<<13);   //重新启用接收 FIFO 操作

   TMC_BASE_SPIA->FFTX |=(0x1);      //将 TX FIFO 级别设置为8
   TMC_BASE_SPIA->FFTX |=(0x1<<5);   //启用中断
   TMC_BASE_SPIA->FFTX |=(0x1<<6);   //清除中断标志
   TMC_BASE_SPIA->FFTX |=(0x1<<13);   //从复位状态释放 FIFO
   TMC_BASE_SPIA->FFTX |=(0x1<<14);   //启用 FIFO 增强功能
   TMC_BASE_SPIA->FFTX |=((uint32) 0x1<<15);   // SPI FIFO 恢复

   //Out of Reset
   TMC_BASE_SPIA->CCR |= 0x0080;  //从复位中撤回 SPI 并设置字符长度

   返回0;


void SPI_SET_Interrupt_TX (void * spiTxFIFOISR){
   //配置中断
   Dint;
   EALLOW;
   TMC_BASE_INT_regs->SPITXINTA =(uint32) spitxFIFOISR;
   EDIS;
   TMC_BASE_PIE -> CTRL |= 0x01;                //启用 PIE 块
   TMC_BASE_PIE ->组[5].IER |= 0x2;      //在 PIE 中启用 I2cInt1A:组6中断2
   IER |= 0x0020;
   EINT;


void SPI_SET_Interrupt_RX (void * spiRxFIFOISR){
   //配置中断
   Dint;
   EALLOW;
   TMC_BASE_INT_regs->SPIRXINTA =(uint32) spirxFIFOISR;
   EDIS;
   TMC_BASE_PIE -> CTRL |= 0x01;                //启用 PIE 块
   TMC_BASE_PIE ->组[5].IER |= 0x1;      //在 PIE 中启用 I2cInt1A:组6中断1
   IER |= 0x0020;
   EINT;

void interrupt_ack_SPI (){
   //确认中断以从所有中断组中获取更多信息
   TMC_BASE_PIE -> ACK |= 0xFFFF;

_interrupt void spiRxFIFOISR (void);
_interrupt void spiTxFIFOISR (void);


uint16 z=0;
uint16 data=0x0000;
int main (空)

   uint32 i=0;

   set_system_controls();
   init_pins_as spi_slave ();
   SPI_SET_Interrupt_RX (&spiRxFIFOISR);
   SPI_SET_Interrupt_TX (&spiRxFIFOISR);


   while (1){

    }

   返回0;


_interrupt void spiRxFIFOISR (void){
   spi_read (&z);
   interrupt_ack_SPI ();


_interrupt void spiTxFIFOISR (void){
   SPI_Send (data);
   interrupt_ack_SPI ();