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.
您好,
我今天尝试用示波器测试SPI通讯时序,分别测试了SPIA自收自发和SPIA主SPIB从的通讯。
SPIA自收自发测试时CCS debug界面显示正常。示波器测SCLK如下图,8个脉冲为一组,单个脉冲宽度为12.4us(高低电平时间均为6.2us),但是每组脉冲之间会有31.4us的时间间隔,请问这是正常现象吗?
测量SIMO引脚发现它会持续发送同一数据,测量时间大概为32.3ms,约重复发送数据243次,请问这该如何解决?
下面是SPIA自收自发的程序:
/* * SPI自收自发 * */ #include "F28x_Project.h" typedef unsigned char Uint8; //声明 void gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI) void spia_init(); void spia_xmit(Uint8 a); //全局变量 char sdata; char rdata; void main() { //初始化 InitSysCtrl();//系统控制 InitGpio();//GPIO DINT;//关中断 InitPieCtrl();//PIE控制寄存器 IER = 0x0000;//中断标志位清零 IFR = 0x0000;//中断标志位清零 InitPieVectTable();//中断向量表 gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI) spia_init(); sdata = 0x0045; for(;;) { spia_xmit(sdata); while(SpiaRegs.SPISTS.bit.INT_FLAG != 1){} rdata = SpiaRegs.SPIRXBUF; sdata++; } } void gpio_init() { /* GPIO 连接端口 I/O 初始值 * 60 SPICLKA_DA SPIA CLK * 59 SPISOMIA_DA SPIA SOMI * 58 SPISIMOA_DA SPIA SIMO */ EALLOW; //SPI //DA(使能、异步、SPI) GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3; GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//SPICLKA GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3; GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//SPISOMIA GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3; GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//SPISIMOA EDIS; } void spia_init() { //DAC1282时钟极性(CPOL)为0,时钟相位(CPHA)为0 //配置控制寄存器(8位保留,0000 0000 0000 0111 = 0x0007) SpiaRegs.SPICCR.bit.SPISWRESET = 0;//SPI复位 SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;//时钟极性为0(SCK空闲为低电平) SpiaRegs.SPICCR.bit.HS_MODE = 0;//关闭高速模式 SpiaRegs.SPICCR.bit.SPILBK = 1;//关闭回环模式 SpiaRegs.SPICCR.bit.SPICHAR = (8-1);//字长8位 //运行控制寄存器(11位保留,0000 0000 0000 0110 = 0x0006) SpiaRegs.SPICTL.bit.OVERRUNINTENA = 1;//禁止接收溢出中断 SpiaRegs.SPICTL.bit.CLK_PHASE = 0;//时钟相位为0(在第一个跳变沿采样) SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//MCU主机 SpiaRegs.SPICTL.bit.TALK = 1;//使能主机发送 SpiaRegs.SPICTL.bit.SPIINTENA = 0;//禁止SPI中断 //SpiaRegs.SPISTS.all = 0; //波特率寄存器(9位保留,0000 0000 0000 007C) /* * LSPCLKfreq=CPUfreq/n //(n=1,2,4,6,8,10,12,14) * SPI Baud Rate=LSPCLKfreq/(SPIBRR+1) * 在不添加外部辅助时钟的情况下 * F28379D的CPU频率为10MHz,对应最低低速外设时钟为715KHz,最低波特率为5586SPS * 此最低波特率大于选择FIR滤波器模式 时的最高波特率4000SPS * 故选择Sinc滤波器模式 ,波特率设置为8000SPS,10分频,SPIBRR=124=0x007C */ EALLOW; ClkCfgRegs.LOSPCP.all = 0x0005;//101(10分频) EDIS; SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C; //优先级控制寄存器 SpiaRegs.SPIPRI.bit.FREE = 1;//仿真时自由运行,断点上暂停不会停止SPI //停止SPI软件复位准备接收或发送 SpiaRegs.SPICCR.bit.SPISWRESET = 1; } void spia_xmit(Uint8 a) { SpiaRegs.SPITXBUF = a;//将8位数据传到串行发送缓冲 }
SPIA主SPIB从测试时将SPIA CLK-SPIB CLK、SPIA SIMO-SPIB SOMI、SPIA SOMI-SPIB SIMO连接,测试SCLK波形与SPIA自收自发相同,但debug界面显示正常运行一段时间后,rdata始终为FFFF,SpiaRegs.SPISTS.bit.INT_FLAG始终为1,跳不出while循环,请问这应该怎么解决?
下面是SPIA主SPIB从的程序:
/* * SPI主从测试 * */ #include "F28x_Project.h" typedef unsigned char Uint8; //声明 void gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI) void spia_init(); void spia_xmit(Uint8 a); void spib_init(); void spib_xmit(Uint8 a); //全局变量 char sdata; char rdata; int i; void main() { //初始化 InitSysCtrl();//系统控制 InitGpio();//GPIO DINT;//关中断 InitPieCtrl();//PIE控制寄存器 IER = 0x0000;//中断标志位清零 IFR = 0x0000;//中断标志位清零 InitPieVectTable();//中断向量表 gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI) spia_init(); spib_init(); sdata = 0x0000; rdata = 0x0000; for(;;) { spia_xmit(sdata); while(SpibRegs.SPISTS.bit.INT_FLAG != 1){} rdata = SpibRegs.SPIRXBUF; sdata++; } } void gpio_init() { /* GPIO 连接端口 I/O 初始值 * 60 SPICLKA_DA SPIA CLK * 59 SPISOMIA_DA SPIA SOMI * 58 SPISIMOA_DA SPIA SIMO * * 65 SPICLKB_AD SPIB CLK * 64 SPISOMIB_AD SPIB SOMI * 63 SPISIMOB_AD SPIB SIMO */ EALLOW; //SPI //DA(使能、异步、SPI) GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3; GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//SPICLKA GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3; GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//SPISOMIA GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3; GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//SPISIMOA //SPI //DA(使能、异步、SPI) GpioCtrlRegs.GPCPUD.bit.GPIO65 = 0; GpioCtrlRegs.GPCQSEL1.bit.GPIO65 = 3; GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 3; GpioCtrlRegs.GPCGMUX1.bit.GPIO65 = 3;//SPICLKB GpioCtrlRegs.GPCPUD.bit.GPIO64 = 0; GpioCtrlRegs.GPCQSEL1.bit.GPIO64 = 3; GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 3; GpioCtrlRegs.GPCGMUX1.bit.GPIO64 = 3;//SPISOMIB GpioCtrlRegs.GPBPUD.bit.GPIO63 = 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO63 = 3; GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 3; GpioCtrlRegs.GPBGMUX2.bit.GPIO63 = 3;//SPISIMOB EDIS; } void spia_init() { //DAC1282时钟极性(CPOL)为0,时钟相位(CPHA)为0 //配置控制寄存器(8位保留,0000 0000 0000 0111 = 0x0007) SpiaRegs.SPICCR.bit.SPISWRESET = 0;//SPI复位 SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;//时钟极性为0(SCK空闲为低电平) SpiaRegs.SPICCR.bit.HS_MODE = 0;//关闭高速模式 SpiaRegs.SPICCR.bit.SPILBK = 1;//关闭回环模式 SpiaRegs.SPICCR.bit.SPICHAR = (8-1);//字长8位 //运行控制寄存器(11位保留,0000 0000 0000 0110 = 0x0006) SpiaRegs.SPICTL.bit.OVERRUNINTENA = 1;//禁止接收溢出中断 SpiaRegs.SPICTL.bit.CLK_PHASE = 0;//时钟相位为0(在第一个跳变沿采样) SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//MCU主机 SpiaRegs.SPICTL.bit.TALK = 1;//使能主机发送 SpiaRegs.SPICTL.bit.SPIINTENA = 0;//禁止SPI中断 //SpiaRegs.SPISTS.all = 0; //波特率寄存器(9位保留,0000 0000 0000 007C) /* * LSPCLKfreq=CPUfreq/n //(n=1,2,4,6,8,10,12,14) * SPI Baud Rate=LSPCLKfreq/(SPIBRR+1) * 在不添加外部辅助时钟的情况下 * F28379D的CPU频率为10MHz,对应最低低速外设时钟为715KHz,最低波特率为5586SPS * 此最低波特率大于选择FIR滤波器模式 时的最高波特率4000SPS * 故选择Sinc滤波器模式 ,波特率设置为8000SPS,10分频,SPIBRR=124=0x007C */ EALLOW; ClkCfgRegs.LOSPCP.all = 0x0005;//101(10分频) EDIS; SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C; //优先级控制寄存器 SpiaRegs.SPIPRI.bit.FREE = 1;//仿真时自由运行,断点上暂停不会停止SPI //停止SPI软件复位准备接收或发送 SpiaRegs.SPICCR.bit.SPISWRESET = 1; } void spib_init() { //DAC1282时钟极性(CPOL)为0,时钟相位(CPHA)为0 //配置控制寄存器(8位保留,0000 0000 0000 0111 = 0x0007) SpibRegs.SPICCR.bit.SPISWRESET = 0;//SPI复位 SpibRegs.SPICCR.bit.CLKPOLARITY = 0;//时钟极性为0(SCK空闲为低电平) SpibRegs.SPICCR.bit.HS_MODE = 0;//关闭高速模式 SpibRegs.SPICCR.bit.SPILBK = 1;//关闭回环模式 SpibRegs.SPICCR.bit.SPICHAR = (8-1);//字长8位 //运行控制寄存器(11位保留,0000 0000 0000 0110 = 0x0006) SpibRegs.SPICTL.bit.OVERRUNINTENA = 1;//禁止接收溢出中断 SpibRegs.SPICTL.bit.CLK_PHASE = 0;//时钟相位为0(在第一个跳变沿采样) SpibRegs.SPICTL.bit.MASTER_SLAVE = 0;//MCU从机 SpibRegs.SPICTL.bit.TALK = 1;//使能主机发送 SpibRegs.SPICTL.bit.SPIINTENA = 0;//禁止SPI中断 //SpiaRegs.SPISTS.all = 0; //波特率寄存器(9位保留,0000 0000 0000 007C) /* * LSPCLKfreq=CPUfreq/n //(n=1,2,4,6,8,10,12,14) * SPI Baud Rate=LSPCLKfreq/(SPIBRR+1) * 在不添加外部辅助时钟的情况下 * F28379D的CPU频率为10MHz,对应最低低速外设时钟为715KHz,最低波特率为5586SPS * 此最低波特率大于选择FIR滤波器模式 时的最高波特率4000SPS * 故选择Sinc滤波器模式 ,波特率设置为8000SPS,10分频,SPIBRR=124=0x007C */ EALLOW; ClkCfgRegs.LOSPCP.all = 0x0005;//101(10分频) EDIS; SpibRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C; //优先级控制寄存器 SpibRegs.SPIPRI.bit.FREE = 1;//仿真时自由运行,断点上暂停不会停止SPI //停止SPI软件复位准备接收或发送 SpibRegs.SPICCR.bit.SPISWRESET = 1; } void spia_xmit(Uint8 a) { SpiaRegs.SPITXBUF = a;//将8位数据传到串行发送缓冲 }
期待并感谢您的回答。
SPIA自收自发测试时CCS debug界面显示正常。示波器测SCLK如下图,8个脉冲为一组,单个脉冲宽度为12.4us(高低电平时间均为6.2us),但是每组脉冲之间会有31.4us的时间间隔,请问这是正常现象吗?
时序看起来应该是正确的。看起来您的 SPICLK 以 80.6kHz 运行。 由于 LSPCLK 设置为 /10 并且您的 BRR 设置为 124,这意味着您的 MCU SYSCLK 以 80.6kHz * (124+1) * (10) = 100MHz 运行。 这些符合您的预期吗?
“分组”也是正常的,因为您没有在 SPI 配置中使用 FIFO 模式。 如果您想要连续数据,您必须启用 FIFO 模式。 C2000ware 中有几个示例可以向您展示如何做到这一点。
测量SIMO引脚发现它会持续发送同一数据,测量时间大概为32.3ms,约重复发送数据243次,请问这该如何解决?
在您的 spia_xmit 代码中,您将 uint8 值写入 uint16 寄存器。 我们认为编译器应该会对此发出警告。 您还需要将您的数据移位 << 8,因为您的 SPI 配置是 8 位的,并且 SPITXBUF 的 MSB 总是首先移出(有关更多信息,请参阅 TRM)。 您的代码应该是这样的:
void spia_xmit(Uint8 a) { SpiaRegs.SPITXBUF = (Uint16)(a<<8);//Pass 8-bit data to serial transmit buffer }
测试SCLK波形与SPIA自收自发相同,但debug界面显示正常运行一段时间后,rdata始终为FFFF,SpiaRegs.SPISTS.bit.INT_FLAG始终为1,跳不出while循环,请问这应该怎么解决?
我没有看到您的 spib_xmit() 代码,所以不太确定可能是什么问题。 但是假设您使用与 spia_xmit() 类似的代码,那么您需要进行与上述相同的更改。
谢谢您的回复,我按照您说的对spia_xmit()和spib_xmit()进行了修改,并在主函数里增加了spib向spia发送数据的代码,但是debug界面显示spia可以正常接收spib的数据,而spib的RXBUF里仍然始终为FF。
下面是修改后的程序:
/* * SPI主从测试 * */ #include "F28x_Project.h" typedef unsigned char Uint8; //声明 void gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI) void spia_init(); void spia_xmit(Uint8 a); void spib_init(); void spib_xmit(Uint8 a); //全局变量 char sdata; char rdata; void main() { //初始化 InitSysCtrl();//系统控制 InitGpio();//GPIO DINT;//关中断 InitPieCtrl();//PIE控制寄存器 IER = 0x0000;//中断标志位清零 IFR = 0x0000;//中断标志位清零 InitPieVectTable();//中断向量表 gpio_init();//配置所有与PCB板相连的GPIO口(包括3线SPI) spia_init(); spib_init(); sdata = 0x0000; rdata = 0x0000; for(;;) { spia_xmit(sdata); while(SpibRegs.SPISTS.bit.INT_FLAG != 1){} rdata = SpibRegs.SPIRXBUF; spib_xmit(sdata); while(SpiaRegs.SPISTS.bit.INT_FLAG != 1){} char rdataa = SpiaRegs.SPIRXBUF; sdata++; } } void gpio_init() { /* GPIO 连接端口 I/O 初始值 * 60 SPICLKA_DA SPIA CLK * 59 SPISOMIA_DA SPIA SOMI * 58 SPISIMOA_DA SPIA SIMO * * 65 SPICLKB_AD SPIB CLK * 64 SPISOMIB_AD SPIB SOMI * 63 SPISIMOB_AD SPIB SIMO */ EALLOW; //SPI //DA(使能、异步、SPI) GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3; GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3; GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//SPICLKA GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3; GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3; GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//SPISOMIA GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3; GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3; GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//SPISIMOA //SPI //DA(使能、异步、SPI) GpioCtrlRegs.GPCPUD.bit.GPIO65 = 0; GpioCtrlRegs.GPCQSEL1.bit.GPIO65 = 3; GpioCtrlRegs.GPCMUX1.bit.GPIO65 = 3; GpioCtrlRegs.GPCGMUX1.bit.GPIO65 = 3;//SPICLKB GpioCtrlRegs.GPCPUD.bit.GPIO64 = 0; GpioCtrlRegs.GPCQSEL1.bit.GPIO64 = 3; GpioCtrlRegs.GPCMUX1.bit.GPIO64 = 3; GpioCtrlRegs.GPCGMUX1.bit.GPIO64 = 3;//SPISOMIB GpioCtrlRegs.GPBPUD.bit.GPIO63 = 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO63 = 3; GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 3; GpioCtrlRegs.GPBGMUX2.bit.GPIO63 = 3;//SPISIMOB EDIS; } void spia_init() { //DAC1282时钟极性(CPOL)为0,时钟相位(CPHA)为0 //配置控制寄存器(8位保留,0000 0000 0000 0111 = 0x0007) SpiaRegs.SPICCR.bit.SPISWRESET = 0;//SPI复位 SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;//时钟极性为0(SCK空闲为低电平) SpiaRegs.SPICCR.bit.HS_MODE = 0;//关闭高速模式 SpiaRegs.SPICCR.bit.SPILBK = 1;//关闭回环模式 SpiaRegs.SPICCR.bit.SPICHAR = (8-1);//字长8位 //运行控制寄存器(11位保留,0000 0000 0000 0110 = 0x0006) SpiaRegs.SPICTL.bit.OVERRUNINTENA = 1;//禁止接收溢出中断 SpiaRegs.SPICTL.bit.CLK_PHASE = 0;//时钟相位为0(在第一个跳变沿采样) SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//MCU主机 SpiaRegs.SPICTL.bit.TALK = 1;//使能主机发送 SpiaRegs.SPICTL.bit.SPIINTENA = 0;//禁止SPI中断 //SpiaRegs.SPISTS.all = 0; //波特率寄存器(9位保留,0000 0000 0000 007C) /* * LSPCLKfreq=CPUfreq/n //(n=1,2,4,6,8,10,12,14) * SPI Baud Rate=LSPCLKfreq/(SPIBRR+1) * 在不添加外部辅助时钟的情况下 * F28379D的CPU频率为10MHz,对应最低低速外设时钟为715KHz,最低波特率为5586SPS * 此最低波特率大于选择FIR滤波器模式 时的最高波特率4000SPS * 故选择Sinc滤波器模式 ,波特率设置为8000SPS,10分频,SPIBRR=124=0x007C */ EALLOW; ClkCfgRegs.LOSPCP.all = 0x0005;//101(10分频) EDIS; SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C; //优先级控制寄存器 SpiaRegs.SPIPRI.bit.FREE = 1;//仿真时自由运行,断点上暂停不会停止SPI //停止SPI软件复位准备接收或发送 SpiaRegs.SPICCR.bit.SPISWRESET = 1; } void spib_init() { //DAC1282时钟极性(CPOL)为0,时钟相位(CPHA)为0 //配置控制寄存器(8位保留,0000 0000 0000 0111 = 0x0007) SpibRegs.SPICCR.bit.SPISWRESET = 0;//SPI复位 SpibRegs.SPICCR.bit.CLKPOLARITY = 0;//时钟极性为0(SCK空闲为低电平) SpibRegs.SPICCR.bit.HS_MODE = 0;//关闭高速模式 SpibRegs.SPICCR.bit.SPILBK = 1;//关闭回环模式 SpibRegs.SPICCR.bit.SPICHAR = (8-1);//字长8位 //运行控制寄存器(11位保留,0000 0000 0000 0110 = 0x0006) SpibRegs.SPICTL.bit.OVERRUNINTENA = 1;//禁止接收溢出中断 SpibRegs.SPICTL.bit.CLK_PHASE = 0;//时钟相位为0(在第一个跳变沿采样) SpibRegs.SPICTL.bit.MASTER_SLAVE = 0;//MCU从机 SpibRegs.SPICTL.bit.TALK = 1;//使能主机发送 SpibRegs.SPICTL.bit.SPIINTENA = 0;//禁止SPI中断 //SpiaRegs.SPISTS.all = 0; //波特率寄存器(9位保留,0000 0000 0000 007C) /* * LSPCLKfreq=CPUfreq/n //(n=1,2,4,6,8,10,12,14) * SPI Baud Rate=LSPCLKfreq/(SPIBRR+1) * 在不添加外部辅助时钟的情况下 * F28379D的CPU频率为10MHz,对应最低低速外设时钟为715KHz,最低波特率为5586SPS * 此最低波特率大于选择FIR滤波器模式 时的最高波特率4000SPS * 故选择Sinc滤波器模式 ,波特率设置为8000SPS,10分频,SPIBRR=124=0x007C */ EALLOW; ClkCfgRegs.LOSPCP.all = 0x0005;//101(10分频) EDIS; SpibRegs.SPIBRR.bit.SPI_BIT_RATE = 0x007C; //优先级控制寄存器 SpibRegs.SPIPRI.bit.FREE = 1;//仿真时自由运行,断点上暂停不会停止SPI //停止SPI软件复位准备接收或发送 SpibRegs.SPICCR.bit.SPISWRESET = 1; } void spia_xmit(Uint8 a) { SpiaRegs.SPITXBUF = (Uint16)(a<<8);//将8位数据传到串行发送缓冲 } void spib_xmit(Uint8 b) { SpibRegs.SPITXBUF = (Uint16)(b<<8);//将8位数据传到串行发送缓冲 }
请问这种情况是什么原因呢?
您在 spia 和 spib 中都启用了环回模式。 两个接口都应禁用环回模式。
SpibRegs.SPICCR.bit.SPILBK = 1;
SpiaRegs.SPICCR.bit.SPILBK = 1;
From TRM:
Loopback mode allows module validation during device testing. This mode is valid only in master mode of the SPI.