I've also try other PORT for SPI communication. It can work and the SPI1 interrupt is available to enter too.
And the update code as below and please refer to it.
#include "common.h"
void SPI0_Master_init(void);
void SPI1_Slave_init(void);
char hal_spi_transfer_one_byte(char v, char end);
char x;
void main(void)
{
char r;
SIM_SCGC5 |= ( SIM_SCGC5_PORTA_MASK
| SIM_SCGC5_PORTB_MASK
| SIM_SCGC5_PORTC_MASK
| SIM_SCGC5_PORTD_MASK
| SIM_SCGC5_PORTE_MASK);
//UART5_C2 |= UART_C2_RIE_MASK;//for Receiver Full Interrupt for uart5
//enable_irq(55);//Enable UART5_RX IRQ
SPI0_Master_init();
SPI1_Slave_init();
//Master send 0x01;
SPI0_MCR&=~SPI_MCR_HALT_MASK;
SPI1_MCR&=~SPI_MCR_HALT_MASK;
enable_irq(27);//Enable SPI1_ISR
EnableInterrupts;
SPI1_PUSHR_SLAVE = 0x0e;
hal_spi_transfer_one_byte(0x01,0);
/*SPI1_PUSHR_SLAVE |= 0x02;
SPI0_PUSHR = SPI_PUSHR_CONT_MASK
|SPI_PUSHR_EOQ_MASK
|SPI_PUSHR_PCS(1<<0) |(0xee);
while((SPI0_SR & SPI_SR_TCF_MASK)==0);
SPI0_SR |= SPI_SR_TCF_MASK;
x =(char)SPI0_POPR&0xff;
out_char(x);*/
while(1);
//enable_irq(27);//Enable SPI1_ISR
//EnableInterrupts;
//Waiting for the data from SPI1
}
void SPI0_Master_init(void)
{
SIM_SCGC6 |= SIM_SCGC6_DSPI0_MASK;//CLK enable for SPI_0 Module
PORTA_PCR14 &= ~PORT_PCR_MUX_MASK;
PORTA_PCR14 |= PORT_PCR_MUX(2); //SPI0_PCS0 //PTC4, PTE16, PTD0
PORTA_PCR15 &= ~PORT_PCR_MUX_MASK;
PORTA_PCR15 |= PORT_PCR_MUX(2); //SPI0_SCK //PTC5, PTD1, PTE17
PORTA_PCR16 &= ~PORT_PCR_MUX_MASK;
PORTA_PCR16 |= PORT_PCR_MUX(2); //SPI0_SOUT //PTC6, PTD2, PTE18
PORTA_PCR17 &= ~PORT_PCR_MUX_MASK;
PORTA_PCR17 |= PORT_PCR_MUX(2); //SPI0_SIN //PTC7, PTD3, PTE19
SPI0_MCR |= (SPI_MCR_MSTR_MASK|SPI_MCR_HALT_MASK);
SPI0_MCR &= ~SPI_MCR_MDIS_MASK;//Clear module disable bit for SPI clocks
SPI0_MCR |= SPI_MCR_DIS_RXF_MASK |
SPI_MCR_DIS_TXF_MASK |
SPI_MCR_CLR_RXF_MASK |
SPI_MCR_CLR_TXF_MASK;
SPI0_MCR |= SPI_MCR_PCSIS(1<<0);
SPI0_CTAR0 &= ~SPI_CTAR_FMSZ_MASK;
SPI0_CTAR0 |= SPI_CTAR_FMSZ(0x7)//Frame Size = 7 + 1
|SPI_CTAR_DBR_MASK // Duty cycle 50/50
|SPI_CTAR_PBR(0)//BAUD RATE PRESCALER is 2
|SPI_CTAR_BR(0x03); //SCK BAUD RATE = (F_busck/PBR)*[(1+DBR)/BR]
SPI0_SR = SPI_SR_RFDF_MASK
|SPI_SR_RFOF_MASK
|SPI_SR_TFFF_MASK
|SPI_SR_TFUF_MASK
|SPI_SR_TCF_MASK
|SPI_SR_EOQF_MASK;
//SPI0_MCR &=~ SPI_MCR_HALT_MASK;
}
void SPI1_Slave_init(void)
{
SIM_SCGC6 |= SIM_SCGC6_DSPI1_MASK;//CLK enable for SPI_1 Module
PORTB_PCR10 &= ~PORT_PCR_MUX_MASK;
PORTB_PCR10 |= PORT_PCR_MUX(2); //SPI1_PCS0 //PTE4
PORTB_PCR11 &= ~PORT_PCR_MUX_MASK;
PORTB_PCR11 |= PORT_PCR_MUX(2); //SPI1_SCK //PTE2
PORTB_PCR16 &= ~PORT_PCR_MUX_MASK;
PORTB_PCR16 |= PORT_PCR_MUX(2); //SPI1_SOUT //PTE1, PTE3
PORTB_PCR17 &= ~PORT_PCR_MUX_MASK;
PORTB_PCR17 |= PORT_PCR_MUX(2); //SPI1_SIN //PTE1, PTE3
SPI1_MCR &=~ SPI_MCR_MSTR_MASK;
SPI1_MCR &= ~SPI_MCR_MDIS_MASK;//Clear module disable bit for SPI clocks
SPI1_MCR |= SPI_MCR_HALT_MASK;
SPI1_MCR |= SPI_MCR_PCSIS(1<<0); //The inactive state of PCSx is high.
SPI1_MCR |= SPI_MCR_DIS_RXF_MASK |
SPI_MCR_DIS_TXF_MASK |
SPI_MCR_CLR_RXF_MASK |
SPI_MCR_CLR_TXF_MASK;
SPI1_CTAR0 &= ~SPI_CTAR_FMSZ_MASK;
SPI1_CTAR0_SLAVE |= SPI_CTAR_FMSZ(0x7);//Frame Size = 7 + 1
SPI1_CTAR0_SLAVE &=~ SPI_CTAR_SLAVE_CPHA_MASK ; //Data is captured on the leading edge of SCK and changed on the following edge
SPI1_CTAR0_SLAVE &=~ SPI_CTAR_SLAVE_CPOL_MASK ; //0 The inactive state value of SCK is low.
SPI1_SR = SPI_SR_RFDF_MASK
|SPI_SR_RFOF_MASK
|SPI_SR_TFFF_MASK
|SPI_SR_TFUF_MASK
|SPI_SR_TCF_MASK
|SPI_SR_EOQF_MASK;
SPI1_RSER|=SPI_RSER_RFDF_RE_MASK;
//SPI1_MCR &=~ SPI_MCR_HALT_MASK;
}
void SPI1_isr(void)
{
//receive_data= (char)SPI1_POPR;
SPI1_SR|= SPI_SR_RFDF_MASK;
SPI1_RSER&=~SPI_RSER_RFDF_RE_MASK;
SPI1_PUSHR_SLAVE = 0;
SPI1_PUSHR_SLAVE |= 0x03;
hal_spi_transfer_one_byte(0xff,0);
SPI1_PUSHR_SLAVE |= 0x02;
SPI0_PUSHR = SPI_PUSHR_CONT_MASK
|SPI_PUSHR_PCS(1<<0) |(0xee);
while((SPI0_SR & SPI_SR_TCF_MASK)==0);
SPI0_SR |= SPI_SR_TCF_MASK;
}
char hal_spi_transfer_one_byte(char v, char end)
{
if(end)
SPI0_PUSHR = //SPI_PUSHR_CONT_MASK |
SPI_PUSHR_EOQ_MASK |
SPI_PUSHR_PCS(1<<0) |
(v);
else
SPI0_PUSHR = SPI_PUSHR_CONT_MASK |
SPI_PUSHR_PCS(1<<0) |
(v);
while((SPI0_SR & SPI_SR_TCF_MASK)==0);
SPI0_SR |= SPI_SR_TCF_MASK;
return (char)SPI0_POPR&0xff;
}
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------