S32K144W problems with custom SPI driver

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

S32K144W problems with custom SPI driver

ソリューションへジャンプ
2,139件の閲覧回数
marco_medrano
Contributor I

Hi NXP community!

I'm developing a custom SPI driver based on the SPI example from the AN5423 application note (https://www.nxp.com/docs/en/application-note/AN5413.pdf)

The problem I'm facing is that after initializing, the SPI is only able to send around 23 bytes of data, no matter what I set as the frame size in the Transmit Command Register (TCR). After that, the clock remains in high state even though I set its polarity as SCK low. While debugging, I found that it gets stuck waiting for the TDF flag of the status register to be 0. Also, the TX fifo seams to be full, but I don't know why it is not sending this data.

Here is my code:

 

static void* SPI_s_vSelectModule(uint8 u8SpiModule){

	void *pAddress = (void*)NULL;

	if(u8SpiModule == (uint8)SPI_enSPI0){

		pAddress = (void*)LPSPI0_BASE_ADDR_cfg;

	}
	else if(u8SpiModule == (uint8)SPI_enSPI2){

		pAddress = (void*)LPSPI2_BASE_ADDR_cfg;

	}
	else{
		/*	 Nothing to do	*/
	}

	return pAddress;
}


void SPI_s_vInitPorts(void){

	/*	Enable clocks	*/
	PCC->PCCn[PCC_PORTB_INDEX]|=PCC_PCCn_CGC_MASK; /* Enable clock for PORTB */
	PCC->PCCn[PCC_PORTC_INDEX]|=PCC_PCCn_CGC_MASK; /* Enable clock for PORTC */
	PCC->PCCn[PCC_PORTD_INDEX]|=PCC_PCCn_CGC_MASK; /* Enable clock for PORTD */

	/*	Config. SPI0	*/
	PORTD->PCR[15]|=PORT_PCR_MUX(4); /* Port D15: MUX = ALT4, LPSPI0_SCK reloj */
	PORTD->PCR[16]|=PORT_PCR_MUX(4); /* Port D16: MUX = ALT4, LPSPI0_SIN/MISO */
	PORTB->PCR[4]|=PORT_PCR_MUX(3); /* Port B4: MUX = ALT3, LPSPI0_SOUT/MOSI */
	PORTB->PCR[5]|=PORT_PCR_MUX(4); /* Port B5: MUX = ALT4, LPSPI0_PCS0 */

	/*	Config. SPI2	*/
	PORTC->PCR[15]|=PORT_PCR_MUX(3); /* Port C15: MUX = ALT3, LPSPI2_SCK reloj */
	PORTC->PCR[0]|=PORT_PCR_MUX(3); /* Port C0: MUX = ALT3, LPSPI2_SIN/MISO */
	PORTC->PCR[1]|=PORT_PCR_MUX(3); /* Port C1: MUX = ALT3, LPSPI2_SOUT/MOSI */
	PORTC->PCR[14]|=PORT_PCR_MUX(3); /* Port C14: MUX = ALT3, LPSPI2_PCS0 */

}

void SPI_vInitMaster(void){

LPSPI_Type *pstSPI;

for(uint8 u8x = 0; u8x < SPI_enTotalSPIs; u8x++){

if(u8x == (uint8)SPI_enSPI0){
PCC->PCCn[PCC_LPSPI0_INDEX] = 0; /* Disable clocks to modify PCS ( default) */
PCC->PCCn[PCC_LPSPI0_INDEX] = 0xC6000000; /* Enable PCS=SPLL_DIV2 (40 MHz func'l clock) */
pstSPI = (LPSPI_Type*)SPI_s_vSelectModule(u8x);
}
else if(u8x == (uint8)SPI_enSPI2){
PCC->PCCn[PCC_LPSPI2_INDEX] = 0; /* Disable clocks to modify PCS ( default) */
PCC->PCCn[PCC_LPSPI2_INDEX] = 0xC6000000; /* Enable PCS=SPLL_DIV2 (40 MHz func'l clock) */
pstSPI = (LPSPI_Type*)SPI_s_vSelectModule(u8x);
}
else{
/* Nothing to do */
}

pstSPI->CR = 0x00000000; /* Disable module for configuration */

pstSPI->IER = 0x00000000; /* Interrupts not used */

pstSPI->DER = 0x00000000; /* DMA not used */

pstSPI->CFGR0 = 0x00000000; /* Defaults: */
/* RDM0=0: rec'd data to FIFO as normal */
/* CIRFIFO=0; Circular FIFO is disabled */
/* HRSEL, HRPOL, HREN=0: Host request disabled */

pstSPI->CFGR1 = 0x00000001; /* Configurations: master mode*/
/* PCSCFG=0: PCS[3:2] are enabled */
/* OUTCFG=0: Output data retains last value when CS negated */
/* PINCFG=0: SIN is input, SOUT is output */
/* MATCFG=0: Match disabled */
/* PCSPOL=0: PCS is active low */
/* NOSTALL=0: Stall if Tx FIFO empty or Rx FIFO full */
/* AUTOPCS=0: does not apply for master mode */
/* SAMPLE=0: input data sampled on SCK edge */
/* MASTER=1: Master mode */

pstSPI->TCR = 0x5000001F; /* Transmit cmd: PCS0, 32bits, prescale func'l clk by 4. */
//pstSPI->TCR = 0x50000007; /* Transmit cmd: PCS0, 32bits, prescale func'l clk by 4. */
/* CPOL=0: SCK inactive state is low */
/* CPHA=1: Change data on SCK lead'g, capture on trail'g edge*/
/* PRESCALE=2: Functional clock divided by 2**2 = 4 */
/* PCS=0: Transfer using PCS0 */
/* LSBF=0: Data is transferred MSB first */
/*pstSPI->TCR = 0x5080001F*/ /* LSBF=1: Data is transferred LSB first */
/* BYSW=0: Byte swap disabled */
/* CONT, CONTC=0: Continuous transfer disabled */
/* RXMSK=0: Normal transfer: rx data stored in rx FIFO */
/* TXMSK=0: Normal transfer: data loaded from tx FIFO */
/* WIDTH=0: Single bit transfer */
/* FRAMESZ=15: # bits in frame = 15+1=16 */

pstSPI->CCR = 0x04090808; /* Clk dividers based on prescaled func'l clk of 100 nsec */
/* SCKPCS=4: SCK to PCS delay = 4+1 = 5 (500 nsec) */
/* PCSSCK=4: PCS to SCK delay = 9+1 = 10 (1 usec) */
/* DBT=8: Delay between Transfers = 8+2 = 10 (1 usec) */
/* SCKDIV=8: SCK divider =8+2 = 10 (1 usec: 1 MHz baud rate) */

pstSPI->FCR = 0x00000003; /* RXWATER=0: Rx flags set when Rx FIFO >0 */
/* TXWATER=3: Tx flags set when Tx FIFO <= 3 */

pstSPI->CR = 0x00000009; /* Enable module for operation */
/* DBGEN=1: module enabled in debug mode */
/* DOZEN=0: module enabled in Doze mode */
/* RST=0: Master logic not reset */
/* MEN=1: Module is enabled */
}

SPI_s_vInitPorts();
}

uint16 SPI_u8Transmit(uint8 u8SpiModule, uint8 *data, uint16 size)
{
	uint16 u16Return = (uint16)NOT_OK;
	LPSPI_Type *pstSPI;
	uint32 buffer=0;

	if(u8SpiModule < (uint8)SPI_enTotalSPIs){

		pstSPI = (LPSPI_Type*)SPI_s_vSelectModule(u8SpiModule);

		if(pstSPI != NULL){

			// Clean Tx buffer
			pstSPI->CR |= 1 << LPSPI_CR_RTF_SHIFT;

			// Configure the FRAMESZ based on the input size
			pstSPI->TCR =  0x50000000 | (size*8 - 1);

			//vSpiDelayMs(5);

			// Send all 32-bit frames that we can handle
			for(int i=0; i<(size / 4); i++)
			{
				buffer = data[4*i + 0] << 24;
				buffer |= data[4*i + 1] << 16;
				buffer |= data[4*i + 2] << 8;
				buffer |= data[4*i + 3];
				/*	Espera al que este libre	*/
				while((pstSPI->SR & LPSPI_SR_TDF_MASK)>>LPSPI_SR_TDF_SHIFT == 0);
				/* Transmit data */
				pstSPI->TDR = buffer;
				/* Se limpia la bandera TDF */
				pstSPI->SR |= LPSPI_SR_TDF_MASK;
			}

			// send remaining bytes
			if(size%4 > 0)
			{
				buffer = 0;
				// Send the remaining data
				for(int i=(size%4); i>0; i--)
				{
					buffer |= data[size - i] << (8*(i-1));
				}
				while((pstSPI->SR & LPSPI_SR_TDF_MASK)>>LPSPI_SR_TDF_SHIFT == 0);
				pstSPI->TDR = buffer;
				/* Se limpia la bandera TDF */
				pstSPI->SR |= LPSPI_SR_TCF_MASK;

			}

			// Clean complete flag
			pstSPI->SR |= 1 << LPSPI_SR_TCF_SHIFT;

			u16Return = (uint16)OK;
		}
		else{
			/*	Nothing to do	*/
		}
	}
	else{
		/*	Nothing to do	*/
	}

	return u16Return;
}

uint8 u8Data[] = {0x01U, 0x02U, 0x03U, 0x04U, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F};

int main(void)
{
	WDOG_Disable();
	SOSC_init_8MHz(); /* Initialize system oscillator for 8 MHz xtal */
	SPLL_init_160MHz(); /* Initialize SPLL to 160 MHz with 8 MHz SOSC */
	NormalRUNmode_80MHz(); /* Init clocks: 80 MHz SPLL & core, 40 MHz bus, 20 MHz flash */
	SPI_vInitMaster();

	SPI_u8Transmit((uint8)SPI_enSPI0, u8Data, sizeof(u8Data));
	SPI_u8Transmit((uint8)SPI_enSPI0, u8Data, sizeof(u8Data));

	while(1)
	{
		vDelayMs(500);
	}
}

 

And here are some readings from a logic analyzer:

marco_medrano_0-1713230449402.png

I've been struggling with this for weeks. I'd really appreciate if you can tell me if I'm missing something

 

タグ(2)
0 件の賞賛
返信
1 解決策
2,112件の閲覧回数
danielmartynek
NXP TechSupport
NXP TechSupport

Hi @marco_medrano,

Try masking the RX data (TCR[RXMSK] = 1).

I don't see any code that would read RDR.

 

Thank you,

BR, Daniel

 

元の投稿で解決策を見る

0 件の賞賛
返信
2 返答(返信)
2,093件の閲覧回数
marco_medrano
Contributor I

That seems to solve the issue. Thanks!

0 件の賞賛
返信
2,113件の閲覧回数
danielmartynek
NXP TechSupport
NXP TechSupport

Hi @marco_medrano,

Try masking the RX data (TCR[RXMSK] = 1).

I don't see any code that would read RDR.

 

Thank you,

BR, Daniel

 

0 件の賞賛
返信
%3CLINGO-SUB%20id%3D%22lingo-sub-1848518%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0SPI%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%81%AES32K144W%E5%95%8F%E9%A1%8C%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-1848518%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3ENXP%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%81%AE%E7%9A%86%E3%81%95%E3%82%93%E3%80%81%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF!%3C%2FP%3E%3CP%3EAN5423%20%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%20%E3%83%8E%E3%83%BC%E3%83%88%20(%3CA%20href%3D%22https%3A%2F%2Fwww.nxp.com%2Fdocs%2Fen%2Fapplication-note%2FAN5413.pdf%3D%22%20target%3D%22_blank%22%20rel%3D%22nofollow%20noopener%20noreferrer%22%3Ehttps%3A%2F%2Fwww.nxp.com%2Fdocs%2Fen%2Fapplication-note%2FAN5413.pdf)%3C%2FA%3E%20%E3%81%AE%20SPI%20%E3%81%AE%E4%BE%8B%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%84%E3%81%A6%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%20SPI%20%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%82%92%E9%96%8B%E7%99%BA%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%3C%2FP%3E%3CP%3E%E7%A7%81%E3%81%8C%E7%9B%B4%E9%9D%A2%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E5%95%8F%E9%A1%8C%E3%81%AF%E3%80%81%E5%88%9D%E6%9C%9F%E5%8C%96%E5%BE%8C%E3%80%81%E9%80%81%E4%BF%A1%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF(TCR)%E3%81%AE%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%A8%E3%81%97%E3%81%A6%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%9F%E5%86%85%E5%AE%B9%E3%81%AB%E9%96%A2%E4%BF%82%E3%81%AA%E3%81%8F%E3%80%81SPI%E3%81%AF%E7%B4%8423%E3%83%90%E3%82%A4%E3%83%88%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%97%E3%81%8B%E9%80%81%E4%BF%A1%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82%E3%81%9D%E3%81%AE%E5%BE%8C%E3%80%81%E6%A5%B5%E6%80%A7%E3%82%92SCK%E3%83%AD%E3%83%BC%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E3%82%82%E3%80%81%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AF%E3%83%8F%E3%82%A4%E7%8A%B6%E6%85%8B%E3%81%AE%E3%81%BE%E3%81%BE%E3%81%A7%E3%81%99%E3%80%82%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E4%B8%AD%E3%81%AB%E3%80%81%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF%E3%81%AETDF%E3%83%95%E3%83%A9%E3%82%B0%E3%81%8C0%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%AE%E3%82%92%E5%BE%85%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%E3%81%BE%E3%81%9F%E3%80%81TX%20fifo%E3%81%AE%E7%B6%99%E3%81%8E%E7%9B%AE%E3%81%8C%E3%81%84%E3%81%A3%E3%81%B1%E3%81%84%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%E3%81%93%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E9%80%81%E4%BF%A1%E3%81%97%E3%81%AA%E3%81%84%E7%90%86%E7%94%B1%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%3C%2FP%3E%3CP%3E%E3%81%93%E3%82%8C%E3%81%8C%E7%A7%81%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E3%81%99%3A%3C%2FP%3E%3CBR%20%2F%3E%3CPRE%20class%3D%22lia-code-sample%20language-c%22%3E%3CCODE%20translate%3D%22no%22%3Estatic%20void*%20SPI_s_vSelectModule(uint8%20u8SpiModule)%7B%0A%0A%09void%20*pAddress%20%3D%20(void*)NULL%3B%0A%0A%09if(u8SpiModule%20%3D%3D%20(uint8)SPI_enSPI0)%7B%0A%0A%09%09pAddress%20%3D%20(void*)LPSPI0_BASE_ADDR_cfg%3B%0A%0A%09%7D%0A%09else%20if(u8SpiModule%20%3D%3D%20(uint8)SPI_enSPI2)%7B%0A%0A%09%09pAddress%20%3D%20(void*)LPSPI2_BASE_ADDR_cfg%3B%0A%0A%09%7D%0A%09else%7B%0A%09%09%2F*%09%20Nothing%20to%20do%09*%2F%0A%09%7D%0A%0A%09return%20pAddress%3B%0A%7D%0A%0A%0Avoid%20SPI_s_vInitPorts(void)%7B%0A%0A%09%2F*%09Enable%20clocks%09*%2F%0A%09PCC-%26gt%3BPCCn%5BPCC_PORTB_INDEX%5D%7C%3DPCC_PCCn_CGC_MASK%3B%20%2F*%20Enable%20clock%20for%20PORTB%20*%2F%0A%09PCC-%26gt%3BPCCn%5BPCC_PORTC_INDEX%5D%7C%3DPCC_PCCn_CGC_MASK%3B%20%2F*%20Enable%20clock%20for%20PORTC%20*%2F%0A%09PCC-%26gt%3BPCCn%5BPCC_PORTD_INDEX%5D%7C%3DPCC_PCCn_CGC_MASK%3B%20%2F*%20Enable%20clock%20for%20PORTD%20*%2F%0A%0A%09%2F*%09Config.%20SPI0%09*%2F%0A%09PORTD-%26gt%3BPCR%5B15%5D%7C%3DPORT_PCR_MUX(4)%3B%20%2F*%20Port%20D15%3A%20MUX%20%3D%20ALT4%2C%20LPSPI0_SCK%20reloj%20*%2F%0A%09PORTD-%26gt%3BPCR%5B16%5D%7C%3DPORT_PCR_MUX(4)%3B%20%2F*%20Port%20D16%3A%20MUX%20%3D%20ALT4%2C%20LPSPI0_SIN%2FMISO%20*%2F%0A%09PORTB-%26gt%3BPCR%5B4%5D%7C%3DPORT_PCR_MUX(3)%3B%20%2F*%20Port%20B4%3A%20MUX%20%3D%20ALT3%2C%20LPSPI0_SOUT%2FMOSI%20*%2F%0A%09PORTB-%26gt%3BPCR%5B5%5D%7C%3DPORT_PCR_MUX(4)%3B%20%2F*%20Port%20B5%3A%20MUX%20%3D%20ALT4%2C%20LPSPI0_PCS0%20*%2F%0A%0A%09%2F*%09Config.%20SPI2%09*%2F%0A%09PORTC-%26gt%3BPCR%5B15%5D%7C%3DPORT_PCR_MUX(3)%3B%20%2F*%20Port%20C15%3A%20MUX%20%3D%20ALT3%2C%20LPSPI2_SCK%20reloj%20*%2F%0A%09PORTC-%26gt%3BPCR%5B0%5D%7C%3DPORT_PCR_MUX(3)%3B%20%2F*%20Port%20C0%3A%20MUX%20%3D%20ALT3%2C%20LPSPI2_SIN%2FMISO%20*%2F%0A%09PORTC-%26gt%3BPCR%5B1%5D%7C%3DPORT_PCR_MUX(3)%3B%20%2F*%20Port%20C1%3A%20MUX%20%3D%20ALT3%2C%20LPSPI2_SOUT%2FMOSI%20*%2F%0A%09PORTC-%26gt%3BPCR%5B14%5D%7C%3DPORT_PCR_MUX(3)%3B%20%2F*%20Port%20C14%3A%20MUX%20%3D%20ALT3%2C%20LPSPI2_PCS0%20*%2F%0A%0A%7D%0A%0Avoid%20SPI_vInitMaster(void)%7B%0A%0ALPSPI_Type%20*pstSPI%3B%0A%0Afor(uint8%20u8x%20%3D%200%3B%20u8x%20%26lt%3B%20SPI_enTotalSPIs%3B%20u8x%2B%2B)%7B%0A%0Aif(u8x%20%3D%3D%20(uint8)SPI_enSPI0)%7B%0APCC-%26gt%3BPCCn%5BPCC_LPSPI0_INDEX%5D%20%3D%200%3B%20%2F*%20Disable%20clocks%20to%20modify%20PCS%20(%20default)%20*%2F%0APCC-%26gt%3BPCCn%5BPCC_LPSPI0_INDEX%5D%20%3D%200xC6000000%3B%20%2F*%20Enable%20PCS%3DSPLL_DIV2%20(40%20MHz%20func'l%20clock)%20*%2F%0ApstSPI%20%3D%20(LPSPI_Type*)SPI_s_vSelectModule(u8x)%3B%0A%7D%0Aelse%20if(u8x%20%3D%3D%20(uint8)SPI_enSPI2)%7B%0APCC-%26gt%3BPCCn%5BPCC_LPSPI2_INDEX%5D%20%3D%200%3B%20%2F*%20Disable%20clocks%20to%20modify%20PCS%20(%20default)%20*%2F%0APCC-%26gt%3BPCCn%5BPCC_LPSPI2_INDEX%5D%20%3D%200xC6000000%3B%20%2F*%20Enable%20PCS%3DSPLL_DIV2%20(40%20MHz%20func'l%20clock)%20*%2F%0ApstSPI%20%3D%20(LPSPI_Type*)SPI_s_vSelectModule(u8x)%3B%0A%7D%0Aelse%7B%0A%2F*%20Nothing%20to%20do%20*%2F%0A%7D%0A%0ApstSPI-%26gt%3BCR%20%3D%200x00000000%3B%20%2F*%20Disable%20module%20for%20configuration%20*%2F%0A%0ApstSPI-%26gt%3BIER%20%3D%200x00000000%3B%20%2F*%20Interrupts%20not%20used%20*%2F%0A%0ApstSPI-%26gt%3BDER%20%3D%200x00000000%3B%20%2F*%20DMA%20not%20used%20*%2F%0A%0ApstSPI-%26gt%3BCFGR0%20%3D%200x00000000%3B%20%2F*%20Defaults%3A%20*%2F%0A%2F*%20RDM0%3D0%3A%20rec'd%20data%20to%20FIFO%20as%20normal%20*%2F%0A%2F*%20CIRFIFO%3D0%3B%20Circular%20FIFO%20is%20disabled%20*%2F%0A%2F*%20HRSEL%2C%20HRPOL%2C%20HREN%3D0%3A%20Host%20request%20disabled%20*%2F%0A%0ApstSPI-%26gt%3BCFGR1%20%3D%200x00000001%3B%20%2F*%20Configurations%3A%20master%20mode*%2F%0A%2F*%20PCSCFG%3D0%3A%20PCS%5B3%3A2%5D%20are%20enabled%20*%2F%0A%2F*%20OUTCFG%3D0%3A%20Output%20data%20retains%20last%20value%20when%20CS%20negated%20*%2F%0A%2F*%20PINCFG%3D0%3A%20SIN%20is%20input%2C%20SOUT%20is%20output%20*%2F%0A%2F*%20MATCFG%3D0%3A%20Match%20disabled%20*%2F%0A%2F*%20PCSPOL%3D0%3A%20PCS%20is%20active%20low%20*%2F%0A%2F*%20NOSTALL%3D0%3A%20Stall%20if%20Tx%20FIFO%20empty%20or%20Rx%20FIFO%20full%20*%2F%0A%2F*%20AUTOPCS%3D0%3A%20does%20not%20apply%20for%20master%20mode%20*%2F%0A%2F*%20SAMPLE%3D0%3A%20input%20data%20sampled%20on%20SCK%20edge%20*%2F%0A%2F*%20MASTER%3D1%3A%20Master%20mode%20*%2F%0A%0ApstSPI-%26gt%3BTCR%20%3D%200x5000001F%3B%20%2F*%20Transmit%20cmd%3A%20PCS0%2C%2032bits%2C%20prescale%20func'l%20clk%20by%204.%20*%2F%0A%2F%2FpstSPI-%26gt%3BTCR%20%3D%200x50000007%3B%20%2F*%20Transmit%20cmd%3A%20PCS0%2C%2032bits%2C%20prescale%20func'l%20clk%20by%204.%20*%2F%0A%2F*%20CPOL%3D0%3A%20SCK%20inactive%20state%20is%20low%20*%2F%0A%2F*%20CPHA%3D1%3A%20Change%20data%20on%20SCK%20lead'g%2C%20capture%20on%20trail'g%20edge*%2F%0A%2F*%20PRESCALE%3D2%3A%20Functional%20clock%20divided%20by%202**2%20%3D%204%20*%2F%0A%2F*%20PCS%3D0%3A%20Transfer%20using%20PCS0%20*%2F%0A%2F*%20LSBF%3D0%3A%20Data%20is%20transferred%20MSB%20first%20*%2F%0A%2F*pstSPI-%26gt%3BTCR%20%3D%200x5080001F*%2F%20%2F*%20LSBF%3D1%3A%20Data%20is%20transferred%20LSB%20first%20*%2F%0A%2F*%20BYSW%3D0%3A%20Byte%20swap%20disabled%20*%2F%0A%2F*%20CONT%2C%20CONTC%3D0%3A%20Continuous%20transfer%20disabled%20*%2F%0A%2F*%20RXMSK%3D0%3A%20Normal%20transfer%3A%20rx%20data%20stored%20in%20rx%20FIFO%20*%2F%0A%2F*%20TXMSK%3D0%3A%20Normal%20transfer%3A%20data%20loaded%20from%20tx%20FIFO%20*%2F%0A%2F*%20WIDTH%3D0%3A%20Single%20bit%20transfer%20*%2F%0A%2F*%20FRAMESZ%3D15%3A%20%23%20bits%20in%20frame%20%3D%2015%2B1%3D16%20*%2F%0A%0ApstSPI-%26gt%3BCCR%20%3D%200x04090808%3B%20%2F*%20Clk%20dividers%20based%20on%20prescaled%20func'l%20clk%20of%20100%20nsec%20*%2F%0A%2F*%20SCKPCS%3D4%3A%20SCK%20to%20PCS%20delay%20%3D%204%2B1%20%3D%205%20(500%20nsec)%20*%2F%0A%2F*%20PCSSCK%3D4%3A%20PCS%20to%20SCK%20delay%20%3D%209%2B1%20%3D%2010%20(1%20usec)%20*%2F%0A%2F*%20DBT%3D8%3A%20Delay%20between%20Transfers%20%3D%208%2B2%20%3D%2010%20(1%20usec)%20*%2F%0A%2F*%20SCKDIV%3D8%3A%20SCK%20divider%20%3D8%2B2%20%3D%2010%20(1%20usec%3A%201%20MHz%20baud%20rate)%20*%2F%0A%0ApstSPI-%26gt%3BFCR%20%3D%200x00000003%3B%20%2F*%20RXWATER%3D0%3A%20Rx%20flags%20set%20when%20Rx%20FIFO%20%26gt%3B0%20*%2F%0A%2F*%20TXWATER%3D3%3A%20Tx%20flags%20set%20when%20Tx%20FIFO%20%26lt%3B%3D%203%20*%2F%0A%0ApstSPI-%26gt%3BCR%20%3D%200x00000009%3B%20%2F*%20Enable%20module%20for%20operation%20*%2F%0A%2F*%20DBGEN%3D1%3A%20module%20enabled%20in%20debug%20mode%20*%2F%0A%2F*%20DOZEN%3D0%3A%20module%20enabled%20in%20Doze%20mode%20*%2F%0A%2F*%20RST%3D0%3A%20Master%20logic%20not%20reset%20*%2F%0A%2F*%20MEN%3D1%3A%20Module%20is%20enabled%20*%2F%0A%7D%0A%0ASPI_s_vInitPorts()%3B%0A%7D%0A%0Auint16%20SPI_u8Transmit(uint8%20u8SpiModule%2C%20uint8%20*data%2C%20uint16%20size)%0A%7B%0A%09uint16%20u16Return%20%3D%20(uint16)NOT_OK%3B%0A%09LPSPI_Type%20*pstSPI%3B%0A%09uint32%20buffer%3D0%3B%0A%0A%09if(u8SpiModule%20%26lt%3B%20(uint8)SPI_enTotalSPIs)%7B%0A%0A%09%09pstSPI%20%3D%20(LPSPI_Type*)SPI_s_vSelectModule(u8SpiModule)%3B%0A%0A%09%09if(pstSPI%20!%3D%20NULL)%7B%0A%0A%09%09%09%2F%2F%20Clean%20Tx%20buffer%0A%09%09%09pstSPI-%26gt%3BCR%20%7C%3D%201%20%26lt%3B%26lt%3B%20LPSPI_CR_RTF_SHIFT%3B%0A%0A%09%09%09%2F%2F%20Configure%20the%20FRAMESZ%20based%20on%20the%20input%20size%0A%09%09%09pstSPI-%26gt%3BTCR%20%3D%20%200x50000000%20%7C%20(size*8%20-%201)%3B%0A%0A%09%09%09%2F%2FvSpiDelayMs(5)%3B%0A%0A%09%09%09%2F%2F%20Send%20all%2032-bit%20frames%20that%20we%20can%20handle%0A%09%09%09for(int%20i%3D0%3B%20i%26lt%3B(size%20%2F%204)%3B%20i%2B%2B)%0A%09%09%09%7B%0A%09%09%09%09buffer%20%3D%20data%5B4*i%20%2B%200%5D%20%26lt%3B%26lt%3B%2024%3B%0A%09%09%09%09buffer%20%7C%3D%20data%5B4*i%20%2B%201%5D%20%26lt%3B%26lt%3B%2016%3B%0A%09%09%09%09buffer%20%7C%3D%20data%5B4*i%20%2B%202%5D%20%26lt%3B%26lt%3B%208%3B%0A%09%09%09%09buffer%20%7C%3D%20data%5B4*i%20%2B%203%5D%3B%0A%09%09%09%09%2F*%09Espera%20al%20que%20este%20libre%09*%2F%0A%09%09%09%09while((pstSPI-%26gt%3BSR%20%26amp%3B%20LPSPI_SR_TDF_MASK)%26gt%3B%26gt%3BLPSPI_SR_TDF_SHIFT%20%3D%3D%200)%3B%0A%09%09%09%09%2F*%20Transmit%20data%20*%2F%0A%09%09%09%09pstSPI-%26gt%3BTDR%20%3D%20buffer%3B%0A%09%09%09%09%2F*%20Se%20limpia%20la%20bandera%20TDF%20*%2F%0A%09%09%09%09pstSPI-%26gt%3BSR%20%7C%3D%20LPSPI_SR_TDF_MASK%3B%0A%09%09%09%7D%0A%0A%09%09%09%2F%2F%20send%20remaining%20bytes%0A%09%09%09if(size%254%20%26gt%3B%200)%0A%09%09%09%7B%0A%09%09%09%09buffer%20%3D%200%3B%0A%09%09%09%09%2F%2F%20Send%20the%20remaining%20data%0A%09%09%09%09for(int%20i%3D(size%254)%3B%20i%26gt%3B0%3B%20i--)%0A%09%09%09%09%7B%0A%09%09%09%09%09buffer%20%7C%3D%20data%5Bsize%20-%20i%5D%20%26lt%3B%26lt%3B%20(8*(i-1))%3B%0A%09%09%09%09%7D%0A%09%09%09%09while((pstSPI-%26gt%3BSR%20%26amp%3B%20LPSPI_SR_TDF_MASK)%26gt%3B%26gt%3BLPSPI_SR_TDF_SHIFT%20%3D%3D%200)%3B%0A%09%09%09%09pstSPI-%26gt%3BTDR%20%3D%20buffer%3B%0A%09%09%09%09%2F*%20Se%20limpia%20la%20bandera%20TDF%20*%2F%0A%09%09%09%09pstSPI-%26gt%3BSR%20%7C%3D%20LPSPI_SR_TCF_MASK%3B%0A%0A%09%09%09%7D%0A%0A%09%09%09%2F%2F%20Clean%20complete%20flag%0A%09%09%09pstSPI-%26gt%3BSR%20%7C%3D%201%20%26lt%3B%26lt%3B%20LPSPI_SR_TCF_SHIFT%3B%0A%0A%09%09%09u16Return%20%3D%20(uint16)OK%3B%0A%09%09%7D%0A%09%09else%7B%0A%09%09%09%2F*%09Nothing%20to%20do%09*%2F%0A%09%09%7D%0A%09%7D%0A%09else%7B%0A%09%09%2F*%09Nothing%20to%20do%09*%2F%0A%09%7D%0A%0A%09return%20u16Return%3B%0A%7D%0A%0Auint8%20u8Data%5B%5D%20%3D%20%7B0x01U%2C%200x02U%2C%200x03U%2C%200x04U%2C%200x05%2C%200x06%2C%200x07%2C%200x08%2C%200x09%2C%200x0A%2C%200x0B%2C%200x0C%2C%200x0D%2C%200x0E%2C%200x0F%2C%200x10%2C%200x11%2C%200x12%2C%200x13%2C%200x14%2C%200x15%2C%200x16%2C%200x17%2C%200x18%2C%200x19%2C%200x1A%2C%200x1B%2C%200x1C%2C%200x1D%2C%200x1E%2C%200x1F%7D%3B%0A%0Aint%20main(void)%0A%7B%0A%09WDOG_Disable()%3B%0A%09SOSC_init_8MHz()%3B%20%2F*%20Initialize%20system%20oscillator%20for%208%20MHz%20xtal%20*%2F%0A%09SPLL_init_160MHz()%3B%20%2F*%20Initialize%20SPLL%20to%20160%20MHz%20with%208%20MHz%20SOSC%20*%2F%0A%09NormalRUNmode_80MHz()%3B%20%2F*%20Init%20clocks%3A%2080%20MHz%20SPLL%20%26amp%3B%20core%2C%2040%20MHz%20bus%2C%2020%20MHz%20flash%20*%2F%0A%09SPI_vInitMaster()%3B%0A%0A%09SPI_u8Transmit((uint8)SPI_enSPI0%2C%20u8Data%2C%20sizeof(u8Data))%3B%0A%09SPI_u8Transmit((uint8)SPI_enSPI0%2C%20u8Data%2C%20sizeof(u8Data))%3B%0A%0A%09while(1)%0A%09%7B%0A%09%09vDelayMs(500)%3B%0A%09%7D%0A%7D%3C%2FCODE%3E%3C%2FPRE%3E%3CBR%20%2F%3E%3CP%3E%E3%81%9D%E3%81%97%E3%81%A6%E3%80%81%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E3%82%A2%E3%83%8A%E3%83%A9%E3%82%A4%E3%82%B6%E3%81%8B%E3%82%89%E3%81%AE%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8A%E5%80%A4%E3%81%AF%E6%AC%A1%E3%81%AE%E3%81%A8%E3%81%8A%E3%82%8A%E3%81%A7%E3%81%99%E3%80%82%3C%2FP%3E%3CP%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-inline%22%20image-alt%3D%22marco_medrano_0-1713230449402.png%22%20style%3D%22width%3A%20400px%3B%22%3E%3Cspan%20class%3D%22lia-inline-image-display-wrapper%22%20image-alt%3D%22marco_medrano_0-1713230449402.png%22%20style%3D%22width%3A%20400px%3B%22%3E%3Cimg%20src%3D%22https%3A%2F%2Fcommunity.nxp.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F273854iEE93745093AB0411%2Fimage-size%2Fmedium%3Fv%3Dv2%26amp%3Bpx%3D400%22%20role%3D%22button%22%20title%3D%22marco_medrano_0-1713230449402.png%22%20alt%3D%22marco_medrano_0-1713230449402.png%22%20%2F%3E%3C%2Fspan%3E%3C%2FSPAN%3E%3C%2FP%3E%3CP%3E%E7%A7%81%E3%81%AF%E4%BD%95%E9%80%B1%E9%96%93%E3%82%82%E3%81%93%E3%82%8C%E3%81%AB%E8%8B%A6%E3%81%97%E3%82%93%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%E4%BD%95%E3%81%8B%E8%B6%B3%E3%82%8A%E3%81%AA%E3%81%84%E3%82%82%E3%81%AE%E3%81%8C%E3%81%82%E3%82%8C%E3%81%B0%E6%95%99%E3%81%88%E3%81%A6%E3%81%84%E3%81%9F%E3%81%A0%E3%81%91%E3%82%8B%E3%81%A8%E6%9C%AC%E5%BD%93%E3%81%AB%E3%81%82%E3%82%8A%E3%81%8C%E3%81%9F%E3%81%84%E3%81%A7%E3%81%99%3C%2FP%3E%3CBR%20%2F%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-1850088%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3ERe%3A%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0SPI%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%81%AES32K144W%E5%95%8F%E9%A1%8C%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-1850088%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E3%81%93%E3%82%8C%E3%81%A7%E5%95%8F%E9%A1%8C%E3%81%AF%E8%A7%A3%E6%B1%BA%E3%81%97%E3%81%9F%E3%82%88%E3%81%86%E3%81%A7%E3%81%99%E3%80%82%E6%84%9F%E8%AC%9D%EF%BC%81%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-1848882%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3ERe%3A%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0SPI%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%81%AES32K144W%E5%95%8F%E9%A1%8C%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-1848882%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EHi%20%3CA%20href%3D%22https%3A%2F%2Fcommunity.nxp.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F232265%22%20target%3D%22_blank%22%3E%40marco_medrano%3C%2FA%3E%2C%3C%2FP%3E%0A%3CP%3ERX%20%E3%83%87%E3%83%BC%E3%82%BF%20(TCR%5BRXMSK%5D%20%3D%201)%20%E3%82%92%E3%83%9E%E3%82%B9%E3%82%AD%E3%83%B3%E3%82%B0%E3%81%97%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%99%E3%80%82%3C%2FP%3E%0A%3CP%3ERDR%E3%82%92%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E8%A6%8B%E5%BD%93%E3%81%9F%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%3C%2FP%3E%0A%3CBR%20%2F%3E%0A%3CP%3E%E3%81%82%E3%82%8A%E3%81%8C%E3%81%A8%E3%81%86%E3%81%94%E3%81%96%E3%81%84%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%3C%2FP%3E%0A%3CP%3EBR%2C%20Daniel%3C%2FP%3E%0A%3CBR%20%2F%3E%3C%2FLINGO-BODY%3E