Hello ,
Is it possible to get SPI 3 wires driver on the Freedom K46.
I Look at the documentation and only see information about the 4 wires spec.
I already implemented the 4 wires and look at the 3 wires possibility( in 3 wires the MOSI line is bidirectionnal and during reading the data is put on the MOSI line).
My actual SPI 4 wires readings :
byte SpiReadReg2(uint8_t addr) {
MySPIPtr = SM1_Init(NULL);
SPI0_BR=0x22;
dataforspi.spi_addr = addr+128;
dataforspi.spi_val = 0XFF;
SPI_CS2_ClrVal();
// send and receive of address and value
(void)SM1_ReceiveBlock(MySPIPtr, &dataforspi, sizeof(spiData));
(void)SM1_SendBlock(MySPIPtr, &dataforspi, sizeof(spiData));
// wait for receiving of the block of data
while(!SM1_GetBlockReceivedStatus(SM1_DeviceData)){};
SPI_CS2_SetVal();
return dataforspi.spi_val;
}
Thanks.
Hi,
Unfortunately, there is no KL46 SPI bidirectional mode driver code.
Please check below validation code for KL25 SPI mode, which test SPI communication using SPI bidirectional mode within SPI0 and SPI1 modules.
Wish it helps.
==========================================================================================================
void spi0_bid_master_spi1_bid_slave(void)
{
global_pass_count = 0;
enable_m0irq(10);
enable_m0irq(11);
PORTD_PCR6 &= ~PORTD_PCR6_MUX_MASK;
PORTD_PCR6 |= PORTD_PCR6_MUX(1)|PORTD_PCR6_DSE_MASK; //Use PTB15 as test result
GPIOD_PDDR |= 0x0040; //Pin is configured for general purpose output
GPIOD_PDOR &= 0xffffffbf; //PTB15 Output 0
PORTD_PCR3 &= ~PORTD_PCR3_MUX_MASK;
PORTD_PCR3 |= PORTD_PCR3_MUX(1)|PORTD_PCR3_DSE_MASK; //Use PTB15 as test result
GPIOD_PDDR |= 0x00008; //Pin is configured for general purpose output
GPIOD_PDOR &= 0xfffffff7;
// PORTB_PCR15 = PORT_PCR_MUX(1)|PORT_PCR_DSE_MASK; //Use PTB15 as test result
// GPIOB_PDDR |= 0x8000; //Pin is configured for general purpose output
// GPIOB_PDOR &= 0xffff7fff; //PTB15 Output 0
//
// PORTB_PCR16 = PORT_PCR_MUX(1)|PORT_PCR_DSE_MASK; //Use PTB16 as test result
// GPIOB_PDDR |= 0x10000; //Pin is configured for general purpose output
// GPIOB_PDOR &= 0xfffeffff;
//printf("SPI bidirection function test master model\n");
SPI0_C1 |= SPI0_C1_MSTR_MASK;
SPI0_BR = 0x43; //SPPR = 4, SPR = 3, bps div = (SPPR+1)*2^(SPR+1) = 80,----Tspi--6.4us
//SPI0_BR = 0x30;//bps div = (SPPR+1)*2^(SPR+1) = 8--------0.64us
SPI0_C1 |= SPI0_C1_SSOE_MASK|SPI0_C1_CPHA_MASK|SPI0_C1_CPOL_MASK|SPI0_C1_LSBFE_MASK;
SPI0_C1 &= (~SPI0_C1_SPIE_MASK); //Disable RX interrrupt
//SPI0_C1 |= SPI1C1_SPIE_MASK; //enable RX interrrupt
SPI0_C1 &= (~SPI0_C1_SPTIE_MASK); //Disable the transmit interrupt
//SPI0_C1 |= SPIC1_SPTIE_MASK; //Enable the transime interrupt
SPI0_C2 |= SPI0_C2_MODFEN_MASK|SPI0_C2_SPMIE_MASK;;
SPI0_C1 |= SPI0_C1_SPE_MASK;
SPI0_M = 0x56;
//set single wire mode
SPI0_C2 |= SPI0_C2_SPC0_MASK;
//Cash: Only MOSI can be used in BID mode, set MOSI input/output
SPI0_C2 |= SPI0_C2_BIDIROE_MASK; //MOSI is used in master as I/O
SPI1_C1 &= (~SPI1_C1_MSTR_MASK);
//SPI0_BR = 0x43; //SPPR = 4, SPR = 3, bps div = (SPPR+1)*2^(SPR+1) = 80,----Tspi--6.4us
//SPI0_BR = 0x30;//bps div = (SPPR+1)*2^(SPR+1) = 8--------0.64us
SPI1_C1 |= SPI1_C1_SSOE_MASK|SPI1_C1_CPHA_MASK|SPI1_C1_CPOL_MASK|SPI1_C1_LSBFE_MASK;
SPI1_C1 &= (~SPI1_C1_SPIE_MASK); //Disable RX interrrupt
//SPI0_C1 |= SPI1C1_SPIE_MASK; //enable RX interrrupt
SPI1_C1 &= (~SPI1_C1_SPTIE_MASK); //Disable the transmit interrupt
//SPI0_C1 |= SPIC1_SPTIE_MASK; //Enable the transime interrupt
SPI1_C2 |= SPI1_C2_MODFEN_MASK|SPI1_C2_SPMIE_MASK;
SPI1_C1 |= SPI1_C1_SPE_MASK;
SPI1_M = 0x5E;
//set single wire mode
SPI1_C2 |= SPI1_C2_SPC0_MASK;
//set MISO input
SPI1_C2 &= ~SPI1_C2_BIDIROE_MASK; //MISO is used in slave mode as input
spi0_send8(0x0E);
rd = spi0_get8(); //Cash: as in the bid I/O mode, the send and the read data should be the same~
rd1 = spi1_get8();
printf("SPI0_rd: %02x\r\n", rd&0xFF);
printf("SPI1_rd: %02x\r\n", rd1&0xFF);
spi0_send8(0x1E);
rd = spi0_get8(); //the send and the read data should be the same~
rd1 = spi1_get8();
printf("SPI0_rd: %02x\r\n", rd&0xFF);
printf("SPI1_rd: %02x\r\n", rd1&0xFF);
spi0_send8(0x2E);
rd = spi0_get8(); //the send and the read data should be the same~
rd1 = spi1_get8();
printf("SPI0_rd: %02x\r\n", rd&0xFF);
printf("SPI1_rd: %02x\r\n", rd1&0xFF);
spi0_send8(0x3E);
rd = spi0_get8(); //the send and the read data should be the same~
rd1 = spi1_get8();
printf("SPI0_rd: %02x\r\n", rd&0xFF);
printf("SPI1_rd: %02x\r\n", rd1&0xFF);
spi0_send8(0x4E);
rd = spi0_get8(); //the send and the read data should be the same~
rd1 = spi1_get8();
printf("SPI0_rd: %02x\r\n", rd&0xFF);
printf("SPI1_rd: %02x\r\n", rd1&0xFF);
spi0_send8(0x5E);
rd = spi0_get8(); //the send and the read data should be the same~
rd1 = spi1_get8();
printf("SPI0_rd: %02x\r\n", rd&0xFF);
printf("SPI1_rd: %02x\r\n", rd1&0xFF);
// while( global_pass_count <= 5 ){
//
// rd = spi1_get8();
//
// global_pass_count++;
// }
global_pass_count = 0;
SPI1_C2 |= SPI0_C2_BIDIROE_MASK; //MISO is used in slave mode as I/O---output
//set MOSI input
SPI0_C2 &= ~SPI0_C2_BIDIROE_MASK; //MOSI is used in master mode as input
while(1)
{
global_pass_count++;
while ((SPI1_S & SPI1_S_SPTEF_MASK) == 0);
SPI1_D = global_pass_count; //0111_1000----MSBF
rd=spi0_send_read(0xFF); //0011_0101----MSBF
printf("SPI0_rd: %02x\r\n", rd&0xFF);
//spi1_send8(global_pass_count);
//spi0_send8(0x5E); //there should no waveforms on MOSI----
//rd = spi0_get8(); //MOSI used as input, the rd data must be zero~~
//printf("Transaction complete!!\n\n");
/* we can set the MOSI to 0xff, to test the input function after make sure no waveform out */
}
}
==========================================================================================================
Have a great day,
best regards,
Ma Hui
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------