<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>S32KのトピックRe: SPI Communication Issue with TC6 SPI Protocol</title>
    <link>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2086452#M48110</link>
    <description>&lt;P class=""&gt;Hello,&lt;/P&gt;&lt;P class=""&gt;&amp;nbsp;&lt;/P&gt;&lt;P class=""&gt;I'm responding to your post as I have experience implementing the &lt;STRONG&gt;TC6 protocol using the LAN8651 MAC-PHY chip from Microchip&lt;/STRONG&gt; on the &lt;STRONG&gt;S32K314 MCU&lt;/STRONG&gt;.&lt;/P&gt;&lt;P class=""&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="malove_0-1745485549079.png" style="width: 400px;"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/334694i7BA07573B8918E93/image-size/medium?v=v2&amp;amp;px=400" role="button" title="malove_0-1745485549079.png" alt="malove_0-1745485549079.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P class=""&gt;In my case, I used &lt;STRONG&gt;RTD 4.0.0&lt;/STRONG&gt; with &lt;STRONG&gt;S32 Design Studio 3.5&lt;/STRONG&gt;, and configured the &lt;STRONG&gt;LPSPI driver&lt;/STRONG&gt; as follows.&lt;/P&gt;&lt;P class=""&gt;&amp;nbsp;&lt;/P&gt;&lt;P class=""&gt;Based on this LPSPI driver, you should be able to configure a uint8_t tx and rx buffer with 12 elements and perform SPI communication accordingly.&lt;/P&gt;&lt;P class=""&gt;ex) uint8_t spiRxBuffer[12], uint8_t spiTxBuffer[12]&lt;/P&gt;</description>
    <pubDate>Thu, 24 Apr 2025 09:06:37 GMT</pubDate>
    <dc:creator>malove</dc:creator>
    <dc:date>2025-04-24T09:06:37Z</dc:date>
    <item>
      <title>SPI Communication Issue with TC6 SPI Protocol</title>
      <link>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2077783#M47614</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;
&lt;P&gt;I am implementing SPI communication between the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;S32K144 MCU&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;and&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;MAC-PHY (LAN8650)&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;For&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;Control Transaction Write/Read&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;(where the master writes/reads a register value to/from the slave), the process follows the&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;TC6 SPI protocol&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;as shown in the image below:&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Muthappan_Viswanthan_0-1744240393943.png" style="width: 400px;"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/332353iDC9CFC54382AD74E/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Muthappan_Viswanthan_0-1744240393943.png" alt="Muthappan_Viswanthan_0-1744240393943.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Before stepping forward to actual register read/write to MAC-PHY, I thought of testing it with some dummy data and verify it by probing in at MOSI of S32K144 and SDI of MAC-PHY(LAN8650) chip. With that I could successfully send 16 bit and 32 bit data, but whereas no data transactions happening for 64 bit transfer.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;As per above picture inorder to read/ write the slave register it should be 64 bits(Control header + Data) or higher.&lt;/P&gt;
&lt;P&gt;The working code 32 bits dummy data transfer is as follows :&amp;nbsp;&lt;/P&gt;
&lt;P&gt;#include "S32K144.h" /* include peripheral declarations S32K144 */&lt;/P&gt;
&lt;P&gt;uint32_t tx_32bits = 0xFD00FD00;&lt;BR /&gt;//uint32_t tx_32bits_array[2] = {0xFD00, 0X1010};&lt;BR /&gt;uint32_t LPSPI0_32bits_read; /* Returned data in to SPI */&lt;/P&gt;
&lt;P&gt;void LPSPI0_init_master(void) {&lt;BR /&gt;PCC-&amp;gt;PCCn[PCC_LPSPI0_INDEX] = 0; /* Disable clocks to modify PCS ( default) */&lt;BR /&gt;PCC-&amp;gt;PCCn[PCC_LPSPI0_INDEX] = 0xC6000000; /* Enable PCS=SPLL_DIV2 (40 MHz func'l clock) */&lt;/P&gt;
&lt;P&gt;LPSPI0-&amp;gt;CR = 0x00000000; /* Disable module for configuration */&lt;BR /&gt;LPSPI0-&amp;gt;IER = 0x00000000; /* Interrupts not used */&lt;BR /&gt;LPSPI0-&amp;gt;DER = 0x00000000; /* DMA not used */&lt;BR /&gt;LPSPI0-&amp;gt;CFGR0 = 0x00000000; /* Defaults: */&lt;BR /&gt;/* RDM0=0: rec'd data to FIFO as normal */&lt;BR /&gt;/* CIRFIFO=0; Circular FIFO is disabled */&lt;BR /&gt;/* HRSEL, HRPOL, HREN=0: Host request disabled */&lt;BR /&gt;LPSPI0-&amp;gt;CFGR1 = 0x00000001; /* Configurations: master mode*/&lt;BR /&gt;/* PCSCFG=0: PCS[3:2] are enabled */&lt;BR /&gt;/* OUTCFG=0: Output data retains last value when CS negated */&lt;BR /&gt;/* PINCFG=0: SIN is input, SOUT is output */&lt;BR /&gt;/* MATCFG=0: Match disabled */&lt;BR /&gt;/* PCSPOL=0: PCS is active low */&lt;BR /&gt;/* NOSTALL=0: Stall if Tx FIFO empty or Rx FIFO full */&lt;BR /&gt;/* AUTOPCS=0: does not apply for master mode */&lt;BR /&gt;/* SAMPLE=0: input data sampled on SCK edge */&lt;BR /&gt;/* MASTER=1: Master mode */&lt;BR /&gt;LPSPI0-&amp;gt;TCR = 0x1100001F; /* Transmit cmd: PCS1, 32 bits, prescale func'l clk by 4, etc*/&lt;BR /&gt;/* CPOL=0: SCK inactive state is low */&lt;BR /&gt;/* CPHA=0: On the rising edge of SCLK the data is captured, while on the falling edge of SCLK the data will change&lt;BR /&gt;/* PRESCALE=2: Functional clock divided by 2**2 = 4 */&lt;BR /&gt;/* PCS=1: Transfer using PCS1 */&lt;BR /&gt;/* LSBF=0: Data is transfered MSB first */&lt;BR /&gt;/* BYSW=0: Byte swap disabled */&lt;BR /&gt;/* CONT, CONTC=0: Continuous transfer disabled */&lt;BR /&gt;/* RXMSK=0: Normal transfer: rx data stored in rx FIFO */&lt;BR /&gt;/* TXMSK=0: Normal transfer: data loaded from tx FIFO */&lt;BR /&gt;/* WIDTH=0: Single bit transfer */&lt;BR /&gt;/* FRAMESZ=31: # bits in frame = 31+1=32 */&lt;BR /&gt;LPSPI0-&amp;gt;CCR = 0x04090808; /* Clock dividers based on prescaled func'l clk of 100 nsec */&lt;BR /&gt;/* SCKPCS=4: SCK to PCS delay = 4+1 = 5 (500 nsec) */&lt;BR /&gt;/* PCSSCK=4: PCS to SCK delay = 9+1 = 10 (1 usec) */&lt;BR /&gt;/* DBT=8: Delay between Transfers = 8+2 = 10 (1 usec) */&lt;BR /&gt;/* SCKDIV=8: SCK divider =8+2 = 10 (1 usec: 1 MHz baud rate) */&lt;BR /&gt;LPSPI0-&amp;gt;FCR = 0x00000003; /* RXWATER=0: Rx flags set when Rx FIFO &amp;gt;0 */&lt;BR /&gt;/* TXWATER=3: Tx flags set when Tx FIFO &amp;lt;= 3 */&lt;BR /&gt;LPSPI0-&amp;gt;CR = 0x00000009; /* Enable module for operation */&lt;BR /&gt;/* DBGEN=1: module enabled in debug mode */&lt;BR /&gt;/* DOZEN=0: module enabled in Doze mode */&lt;BR /&gt;/* RST=0: Master logic not reset */&lt;BR /&gt;/* MEN=1: Module is enabled */&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;void LPSPI0_tx_32bits (uint32_t send) {&lt;BR /&gt;while((LPSPI0-&amp;gt;SR &amp;amp; LPSPI_SR_TDF_MASK)&amp;gt;&amp;gt;LPSPI_SR_TDF_SHIFT==0);&lt;BR /&gt;/* Wait for Tx FIFO available */&lt;BR /&gt;LPSPI0-&amp;gt;TDR = send; /* Transmit data */&lt;BR /&gt;LPSPI0-&amp;gt;SR |= LPSPI_SR_TDF_MASK; /* Clear TDF flag */&lt;BR /&gt;}&lt;/P&gt;
&lt;P&gt;uint32_t LPSPI0_rx_32bits (void) {&lt;BR /&gt;uint32_t recieve = 0;&lt;/P&gt;
&lt;P&gt;while((LPSPI0-&amp;gt;SR &amp;amp; LPSPI_SR_RDF_MASK)&amp;gt;&amp;gt;LPSPI_SR_RDF_SHIFT==0);&lt;BR /&gt;/* Wait at least one RxFIFO entry */&lt;BR /&gt;recieve= LPSPI0-&amp;gt;RDR; /* Read received data */&lt;BR /&gt;LPSPI0-&amp;gt;SR |= LPSPI_SR_RDF_MASK; /* Clear RDF flag */&lt;BR /&gt;return recieve; /* Return received data */&lt;BR /&gt;}&lt;/P&gt;
&lt;P&gt;void PORT_init (void) {&lt;BR /&gt;  //Master:&lt;BR /&gt;  PCC-&amp;gt;PCCn[PCC_PORTB_INDEX] |= PCC_PCCn_CGC_MASK;&lt;BR /&gt;  PORTB-&amp;gt;PCR[2] |= PORT_PCR_MUX(3); /*Port B2: MUX = ALT3, SCK*/&lt;BR /&gt;  PORTB-&amp;gt;PCR[3] |= PORT_PCR_MUX(3); /*Port B3: MUX = ALT3, SIN*/&lt;BR /&gt;  PORTB-&amp;gt;PCR[4] |= PORT_PCR_MUX(3); /*Port B4: MUX = ALT3, SOUT*/&lt;BR /&gt;  PORTB-&amp;gt;PCR[5] |= PORT_PCR_MUX(3);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;int main(void) {&lt;BR /&gt;uint32_t counter = 0;&lt;BR /&gt;volatile int i;&lt;BR /&gt;WDOG_disable();&lt;BR /&gt;SOSC_init_8MHz(); /* Initialize system oscillator for 8 MHz xtal */&lt;BR /&gt;SPLL_init_160MHz(); /* Initialize SPLL to 160 MHz with 8 MHz SOSC */&lt;BR /&gt;NormalRUNmode_80MHz(); /* Init clocks: 80 MHz sysclk &amp;amp; core, 40 MHz bus, 20 MHz flash */&lt;/P&gt;
&lt;P&gt;LPSPI0_init_master();&lt;/P&gt;
&lt;P&gt;PORT_init();&lt;/P&gt;
&lt;P&gt;for (;;) {&lt;BR /&gt;LPSPI0_tx_32bits(tx_32bits);&lt;/P&gt;
&lt;P&gt;LPSPI0_32bits_read = LPSPI0_rx_32bits();&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;return 0;&lt;BR /&gt;}&lt;/P&gt;
&lt;P&gt;&lt;LI-WRAPPER&gt;&lt;/LI-WRAPPER&gt;&lt;/P&gt;
&lt;P&gt;Note : For 64 bit data transfer, I changed TCR[FRAMESZ]=3F and changed respective data types and values.&lt;/P&gt;
&lt;P&gt;My questions are:&lt;/P&gt;
&lt;P&gt;1. Is S32K144 doesnt support whole 64 bit transfer in one go? [In&amp;nbsp;S32K1xx Series Reference Manual, Rev. 14 at start of page 1623 it means as the maximum frame size is 32 bits?]&lt;/P&gt;
&lt;P&gt;2. If it supports only 32 bits, then kindly help me the way that on how to transfer &amp;gt;=64 bits of data.&lt;/P&gt;
&lt;P&gt;3. Else if it supports 64 bits, then kindly point me out the changes i have to perform in the above code.&lt;/P&gt;
&lt;P&gt;Thanks in advance!&lt;/P&gt;</description>
      <pubDate>Wed, 09 Apr 2025 23:38:12 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2077783#M47614</guid>
      <dc:creator>Muthappan_Viswanthan</dc:creator>
      <dc:date>2025-04-09T23:38:12Z</dc:date>
    </item>
    <item>
      <title>Re: SPI Communication Issue with TC6 SPI Protocol</title>
      <link>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2078278#M47642</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;yes, lpspi allows sending/receiving frame that has size larger that 32 bits. There could be several ways to do that.&lt;/P&gt;
&lt;P&gt;1. set FRAMESZ to be multiple of 32, as per your need, how many words have to be transferred (up to 128)&lt;BR /&gt;2. set FRAMESZ to 31 for 32bit frame size and &lt;BR /&gt;a) control CS manually and fill data registers as per desired number of word transfer. You can refer to below code&amp;nbsp;&lt;BR /&gt;&lt;A href="https://community.nxp.com/t5/S32K/S32K146-LPSPI-with-ADXL314/m-p/1826209/highlight/true#M32845" target="_blank"&gt;https://community.nxp.com/t5/S32K/S32K146-LPSPI-with-ADXL314/m-p/1826209/highlight/true#M32845&lt;/A&gt;&lt;BR /&gt;b) use continuous selection, refer to&amp;nbsp;&lt;A href="https://community.nxp.com/t5/S32K/Continuous-Transfer-LPSPI-S32K14x/td-p/1830165" target="_blank"&gt;https://community.nxp.com/t5/S32K/Continuous-Transfer-LPSPI-S32K14x/td-p/1830165&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;For sure above codes need to be modified for 32bit transfer.&lt;/P&gt;
&lt;P&gt;Hope it helps.&lt;/P&gt;
&lt;P&gt;BR, Petr&lt;/P&gt;</description>
      <pubDate>Thu, 10 Apr 2025 10:51:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2078278#M47642</guid>
      <dc:creator>PetrS</dc:creator>
      <dc:date>2025-04-10T10:51:21Z</dc:date>
    </item>
    <item>
      <title>Re: SPI Communication Issue with TC6 SPI Protocol</title>
      <link>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2080218#M47753</link>
      <description>&lt;P&gt;Hello,&lt;BR /&gt;&lt;BR /&gt;I used 2 a) [&amp;nbsp;&lt;SPAN&gt;set FRAMESZ to 31 for 32bit frame size and&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;control CS manually and fill data registers as per desired number of word transfer.] with some dummy data and it worked. Now, when I tried with my actual task where I need to communicate with LAN8650 chip, I should write/read by sending control header first where the respective address should be present:&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Muthappan_Viswanthan_0-1744662637917.png" style="width: 400px;"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/332980i3292933BE0C33D14/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Muthappan_Viswanthan_0-1744662637917.png" alt="Muthappan_Viswanthan_0-1744662637917.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;For this purpose I used the below code :&amp;nbsp;&lt;/P&gt;
&lt;DIV&gt;#include "S32K144.h" /* include peripheral declarations S32K144 */&lt;/DIV&gt;
&lt;DIV&gt;#define CS_LOW()&amp;nbsp; &amp;nbsp; (PTB-&amp;gt;PCOR = (1 &amp;lt;&amp;lt; 5))&amp;nbsp; // Clear bit to pull CS low&lt;/DIV&gt;
&lt;DIV&gt;#define CS_HIGH()&amp;nbsp; &amp;nbsp;(PTB-&amp;gt;PSOR = (1 &amp;lt;&amp;lt; 5))&amp;nbsp; // Set bit to pull CS high&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;//System registers (MMS = 0)&lt;/DIV&gt;
&lt;DIV&gt;const TC6Reg TC6ADR_RESET&amp;nbsp; &amp;nbsp; &amp;nbsp; = { .mms = 0x00, .addr = 0x003 };&lt;/DIV&gt;
&lt;DIV&gt;const TC6Reg TC6ADR_CONFIG0&amp;nbsp; &amp;nbsp; = {.mms = 0x00, 0x0004};&lt;/DIV&gt;
&lt;DIV&gt;const TC6Reg TC6ADR_STATUS0&amp;nbsp; &amp;nbsp; = {.mms = 0x00, 0x0008};&lt;/DIV&gt;
&lt;DIV&gt;const TC6Reg TC6ADR_IMASK0&amp;nbsp; &amp;nbsp; &amp;nbsp;= {.mms = 0x00, 0x000C};&lt;/DIV&gt;
&lt;DIV&gt;const TC6Reg TC6ADR_PLCACTL0&amp;nbsp; &amp;nbsp;= {.mms = 0x04, 0xCA01};&lt;/DIV&gt;
&lt;DIV&gt;const TC6Reg TC6ADR_PLCACTL1&amp;nbsp; &amp;nbsp;= {.mms = 0x04, 0xCA02};&lt;/DIV&gt;
&lt;DIV&gt;const TC6Reg TC6ADR_PLCASTAT&amp;nbsp; &amp;nbsp;= {.mms = 0x04, 0xCA03};&lt;/DIV&gt;
&lt;DIV&gt;const TC6Reg TC6ADR_MAC_NCR&amp;nbsp; &amp;nbsp; = {.mms = 0x01, 0x0000};&lt;/DIV&gt;
&lt;DIV&gt;const TC6Reg TC6ADR_MAC_NCFGR&amp;nbsp; = {.mms = 0x01, 0x0001};&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;uint32_t tx_16bits = 0xFD00FD00;&lt;/DIV&gt;
&lt;DIV&gt;uint32_t tx_32bits_array[2] = {0xFD00, 0X1010};&lt;/DIV&gt;
&lt;DIV&gt;uint32_t LPSPI0_16bits_read; /* Returned data in to SPI */&lt;/DIV&gt;
&lt;DIV&gt;uint16_t lan8650_phy_id = 0;&lt;/DIV&gt;
&lt;DIV&gt;uint32_t tx_upper = 0xFD00FD00;&lt;/DIV&gt;
&lt;DIV&gt;uint32_t tx_lower = 0x1010ABCD;&lt;/DIV&gt;
&lt;DIV&gt;uint32_t rx_upper, rx_lower;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;// Calculates odd parity for a 32-bit word (excluding bit 0)&lt;/DIV&gt;
&lt;DIV&gt;uint8_t calculate_parity(uint32_t word31to1) {&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;uint8_t count = 0;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;int i;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;for (i = 1; i &amp;lt; 32; i++) {&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ((word31to1 &amp;gt;&amp;gt; i) &amp;amp; 0x01) count++;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;}&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;return (count % 2 == 0) ? 0 : 1;&amp;nbsp; // Return 0 if even (to make odd)&lt;/DIV&gt;
&lt;DIV&gt;}&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;uint32_t build_ctrl_header(uint8_t wnr, uint8_t mms, uint16_t addr, uint8_t num_regs) {&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;uint32_t header = 0;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;header |= (0U &amp;lt;&amp;lt; 31);&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// DNC = 0 (Control)&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;header |= (0U &amp;lt;&amp;lt; 30);&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// HDRB = 0 (Ignored on write)&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;header |= ((wnr &amp;amp; 0x01) &amp;lt;&amp;lt; 29);&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// WNR: 1 = write, 0 = read&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;header |= (0U &amp;lt;&amp;lt; 28);&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// AID = 0 (auto-increment)&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;header |= ((mms &amp;amp; 0x0F) &amp;lt;&amp;lt; 24);&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// MMS = memory map select&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;header |= ((addr &amp;amp; 0xFFFF) &amp;lt;&amp;lt; 8);&amp;nbsp; &amp;nbsp; &amp;nbsp;// Register address&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;header |= ((num_regs &amp;amp; 0x7F) &amp;lt;&amp;lt; 1);&amp;nbsp; &amp;nbsp;// Length (in registers), shifted to [7:1]&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;uint8_t parity = calculate_parity(header &amp;amp; 0xFFFFFFFE); // Clear bit 0 for parity calc&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;header |= parity; // Set bit 1 to make parity odd&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;return header;&lt;/DIV&gt;
&lt;DIV&gt;}&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;void LPSPI0_init_master(void) {&lt;/DIV&gt;
&lt;DIV&gt;PCC-&amp;gt;PCCn[PCC_LPSPI0_INDEX] = 0; /* Disable clocks to modify PCS ( default) */&lt;/DIV&gt;
&lt;DIV&gt;PCC-&amp;gt;PCCn[PCC_LPSPI0_INDEX] = 0xC6000000; /* Enable PCS=SPLL_DIV2 (40 MHz func'l clock) */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;LPSPI0-&amp;gt;CR = 0x00000000; /* Disable module for configuration */&lt;/DIV&gt;
&lt;DIV&gt;LPSPI0-&amp;gt;IER = 0x00000000; /* Interrupts not used */&lt;/DIV&gt;
&lt;DIV&gt;LPSPI0-&amp;gt;DER = 0x00000000; /* DMA not used */&lt;/DIV&gt;
&lt;DIV&gt;LPSPI0-&amp;gt;CFGR0 = 0x00000000; /* Defaults: */&lt;/DIV&gt;
&lt;DIV&gt;/* RDM0=0: rec'd data to FIFO as normal */&lt;/DIV&gt;
&lt;DIV&gt;/* CIRFIFO=0; Circular FIFO is disabled */&lt;/DIV&gt;
&lt;DIV&gt;/* HRSEL, HRPOL, HREN=0: Host request disabled */&lt;/DIV&gt;
&lt;DIV&gt;LPSPI0-&amp;gt;CFGR1 = 0x00000001; /* Configurations: master mode*/&lt;/DIV&gt;
&lt;DIV&gt;/* PCSCFG=0: PCS[3:2] are enabled */&lt;/DIV&gt;
&lt;DIV&gt;/* OUTCFG=0: Output data retains last value when CS negated */&lt;/DIV&gt;
&lt;DIV&gt;/* PINCFG=0: SIN is input, SOUT is output */&lt;/DIV&gt;
&lt;DIV&gt;/* MATCFG=0: Match disabled */&lt;/DIV&gt;
&lt;DIV&gt;/* PCSPOL=0: PCS is active low */&lt;/DIV&gt;
&lt;DIV&gt;/* NOSTALL=0: Stall if Tx FIFO empty or Rx FIFO full */&lt;/DIV&gt;
&lt;DIV&gt;/* AUTOPCS=0: does not apply for master mode */&lt;/DIV&gt;
&lt;DIV&gt;/* SAMPLE=0: input data sampled on SCK edge */&lt;/DIV&gt;
&lt;DIV&gt;/* MASTER=1: Master mode */&lt;/DIV&gt;
&lt;DIV&gt;LPSPI0-&amp;gt;TCR = 0x1100001F; /* Transmit cmd: PCS3, 16 bits, prescale func'l clk by 4, etc*/&lt;/DIV&gt;
&lt;DIV&gt;/* CPOL=0: SCK inactive state is low */&lt;/DIV&gt;
&lt;DIV&gt;/* CPHA=0: On the rising edge of SCLK the data is captured, while on the falling edge of SCLK the data will change&lt;/DIV&gt;
&lt;DIV&gt;/* PRESCALE=2: Functional clock divided by 2**2 = 4 */&lt;/DIV&gt;
&lt;DIV&gt;/* PCS=3: Transfer using PCS3 */&lt;/DIV&gt;
&lt;DIV&gt;/* LSBF=0: Data is transfered MSB first */&lt;/DIV&gt;
&lt;DIV&gt;/* BYSW=0: Byte swap disabled */&lt;/DIV&gt;
&lt;DIV&gt;/* CONT, CONTC=0: Continuous transfer disabled */&lt;/DIV&gt;
&lt;DIV&gt;/* RXMSK=0: Normal transfer: rx data stored in rx FIFO */&lt;/DIV&gt;
&lt;DIV&gt;/* TXMSK=0: Normal transfer: data loaded from tx FIFO */&lt;/DIV&gt;
&lt;DIV&gt;/* WIDTH=0: Single bit transfer */&lt;/DIV&gt;
&lt;DIV&gt;/* FRAMESZ=31: # bits in frame = 31+1=32 */&lt;/DIV&gt;
&lt;DIV&gt;LPSPI0-&amp;gt;CCR = 0x04090808; /* Clock dividers based on prescaled func'l clk of 100 nsec */&lt;/DIV&gt;
&lt;DIV&gt;/* SCKPCS=4: SCK to PCS delay = 4+1 = 5 (500 nsec) */&lt;/DIV&gt;
&lt;DIV&gt;/* PCSSCK=4: PCS to SCK delay = 9+1 = 10 (1 usec) */&lt;/DIV&gt;
&lt;DIV&gt;/* DBT=8: Delay between Transfers = 8+2 = 10 (1 usec) */&lt;/DIV&gt;
&lt;DIV&gt;/* SCKDIV=8: SCK divider =8+2 = 10 (1 usec: 1 MHz baud rate) */&lt;/DIV&gt;
&lt;DIV&gt;LPSPI0-&amp;gt;FCR = 0x00000003; /* RXWATER=0: Rx flags set when Rx FIFO &amp;gt;0 */&lt;/DIV&gt;
&lt;DIV&gt;/* TXWATER=3: Tx flags set when Tx FIFO &amp;lt;= 3 */&lt;/DIV&gt;
&lt;DIV&gt;LPSPI0-&amp;gt;CR = 0x00000009; /* Enable module for operation */&lt;/DIV&gt;
&lt;DIV&gt;/* DBGEN=1: module enabled in debug mode */&lt;/DIV&gt;
&lt;DIV&gt;/* DOZEN=0: module enabled in Doze mode */&lt;/DIV&gt;
&lt;DIV&gt;/* RST=0: Master logic not reset */&lt;/DIV&gt;
&lt;DIV&gt;/* MEN=1: Module is enabled */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;}&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;void LPSPI0_tx_32bits (uint32_t send) {&lt;/DIV&gt;
&lt;DIV&gt;while((LPSPI0-&amp;gt;SR &amp;amp; LPSPI_SR_TDF_MASK)&amp;gt;&amp;gt;LPSPI_SR_TDF_SHIFT==0);&lt;/DIV&gt;
&lt;DIV&gt;/* Wait for Tx FIFO available */&lt;/DIV&gt;
&lt;DIV&gt;LPSPI0-&amp;gt;TDR = send; /* Transmit data */&lt;/DIV&gt;
&lt;DIV&gt;LPSPI0-&amp;gt;SR |= LPSPI_SR_TDF_MASK; /* Clear TDF flag */&lt;/DIV&gt;
&lt;DIV&gt;}&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;uint32_t LPSPI0_rx_32bits (void) {&lt;/DIV&gt;
&lt;DIV&gt;uint32_t recieve = 0;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;while((LPSPI0-&amp;gt;SR &amp;amp; LPSPI_SR_RDF_MASK)&amp;gt;&amp;gt;LPSPI_SR_RDF_SHIFT==0);&lt;/DIV&gt;
&lt;DIV&gt;/* Wait at least one RxFIFO entry */&lt;/DIV&gt;
&lt;DIV&gt;recieve= LPSPI0-&amp;gt;RDR; /* Read received data */&lt;/DIV&gt;
&lt;DIV&gt;LPSPI0-&amp;gt;SR |= LPSPI_SR_RDF_MASK; /* Clear RDF flag */&lt;/DIV&gt;
&lt;DIV&gt;return recieve; /* Return received data */&lt;/DIV&gt;
&lt;DIV&gt;}&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;void SOSC_init_8MHz(void) {&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;SCG-&amp;gt;SOSCDIV=0x00000101; /* SOSCDIV1 &amp;amp; SOSCDIV2 =1: divide by 1 */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;SCG-&amp;gt;SOSCCFG=0x00000024; /* Range=2: Medium freq (SOSC between 1MHz-8MHz)*/&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;/* HGO=0: Config xtal osc for low power */&lt;/DIV&gt;
&lt;DIV&gt;/* EREFS=1: Input is external XTAL */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;while(SCG-&amp;gt;SOSCCSR &amp;amp; SCG_SOSCCSR_LK_MASK); /* Ensure SOSCCSR unlocked */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;SCG-&amp;gt;SOSCCSR=0x00000001; /* LK=0: SOSCCSR can be written */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;/* SOSCCMRE=0: OSC CLK monitor IRQ if enabled */&lt;/DIV&gt;
&lt;DIV&gt;/* SOSCCM=0: OSC CLK monitor disabled */&lt;/DIV&gt;
&lt;DIV&gt;/* SOSCERCLKEN=0: Sys OSC 3V ERCLK output clk disabled */&lt;/DIV&gt;
&lt;DIV&gt;/* SOSCLPEN=0: Sys OSC disabled in VLP modes */&lt;/DIV&gt;
&lt;DIV&gt;/* SOSCSTEN=0: Sys OSC disabled in Stop modes */&lt;/DIV&gt;
&lt;DIV&gt;/* SOSCEN=1: Enable oscillator */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;while(!(SCG-&amp;gt;SOSCCSR &amp;amp; SCG_SOSCCSR_SOSCVLD_MASK)); /* Wait for sys OSC clk valid */&lt;/DIV&gt;
&lt;DIV&gt;}&lt;/DIV&gt;
&lt;DIV&gt;void SPLL_init_160MHz(void) {&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;while(SCG-&amp;gt;SPLLCSR &amp;amp; SCG_SPLLCSR_LK_MASK); /* Ensure SPLLCSR unlocked */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;SCG-&amp;gt;SPLLCSR = 0x00000000; /* SPLLEN=0: SPLL is disabled (default) */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;SCG-&amp;gt;SPLLDIV = 0x00000302; /* SPLLDIV1 divide by 2; SPLLDIV2 divide by 4 */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;SCG-&amp;gt;SPLLCFG = 0x00180000; /* PREDIV=0: Divide SOSC_CLK by 0+1=1 */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;/* MULT=24: Multiply sys pll by 4+24=40 */&lt;/DIV&gt;
&lt;DIV&gt;/* SPLL_CLK = 8MHz / 1 * 40 / 2 = 160 MHz */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;while(SCG-&amp;gt;SPLLCSR &amp;amp; SCG_SPLLCSR_LK_MASK); /* Ensure SPLLCSR unlocked */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;SCG-&amp;gt;SPLLCSR = 0x00000001; /* LK=0: SPLLCSR can be written */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;/* SPLLCMRE=0: SPLL CLK monitor IRQ if enabled */&lt;/DIV&gt;
&lt;DIV&gt;/* SPLLCM=0: SPLL CLK monitor disabled */&lt;/DIV&gt;
&lt;DIV&gt;/* SPLLSTEN=0: SPLL disabled in Stop modes */&lt;/DIV&gt;
&lt;DIV&gt;/* SPLLEN=1: Enable SPLL */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;while(!(SCG-&amp;gt;SPLLCSR &amp;amp; SCG_SPLLCSR_SPLLVLD_MASK)); /* Wait for SPLL valid */&lt;/DIV&gt;
&lt;DIV&gt;}&lt;/DIV&gt;
&lt;DIV&gt;void NormalRUNmode_80MHz (void) { /* Change to normal RUN mode with 8MHz SOSC, 80 MHz PLL*/&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;SCG-&amp;gt;RCCR=SCG_RCCR_SCS(6) /* PLL as clock source*/&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;|SCG_RCCR_DIVCORE(0b01) /* DIVCORE=1, div. by 2: Core clock = 160/2 MHz = 80 MHz*/&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;|SCG_RCCR_DIVBUS(0b01) /* DIVBUS=1, div. by 2: bus clock = 40 MHz*/&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;|SCG_RCCR_DIVSLOW(0b10); /* DIVSLOW=2, div. by 3: SCG slow, flash clock= 26 2/3 MHz*/&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;while (((SCG-&amp;gt;CSR &amp;amp; SCG_CSR_SCS_MASK) &amp;gt;&amp;gt; SCG_CSR_SCS_SHIFT ) != 6) {}&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;/* Wait for sys clk src=SPLL */&lt;/DIV&gt;
&lt;DIV&gt;}&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;/* TXWATER=3: Tx flags set when Tx FIFO &amp;lt;= 3 */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;void WDOG_disable (void){&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;WDOG-&amp;gt;CNT=0xD928C520; /*Unlock watchdog*/&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;WDOG-&amp;gt;TOVAL=0x0000FFFF; /*Maximum timeout value*/&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;WDOG-&amp;gt;CS = 0x00002100; /*Disable watchdog*/&lt;/DIV&gt;
&lt;DIV&gt;}&lt;/DIV&gt;
&lt;DIV&gt;void PORT_init (void) {&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt; //Master:&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt; PCC-&amp;gt;PCCn[PCC_PORTB_INDEX] |= PCC_PCCn_CGC_MASK;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt; PORTB-&amp;gt;PCR[2] |= PORT_PCR_MUX(3); /*Port B2: MUX = ALT3, SCK*/&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt; PORTB-&amp;gt;PCR[3] |= PORT_PCR_MUX(3); /*Port B3: MUX = ALT3, SIN*/&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt; PORTB-&amp;gt;PCR[4] |= PORT_PCR_MUX(3); /*Port B4: MUX = ALT3, SOUT*/&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt; //PORTB-&amp;gt;PCR[5] |= PORT_PCR_MUX(3);&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt; PORTB-&amp;gt;PCR[5] |= PORT_PCR_MUX(1);&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt; PTB-&amp;gt;PDDR |= (1&amp;lt;&amp;lt;5);&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt; PTB-&amp;gt;PSOR |= (1&amp;lt;&amp;lt;5);&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;}&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;void lan8650_write_reset(void) {&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;uint32_t header = build_ctrl_header(1, 0x00, 0x0003, 0); // Write to RESET reg&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;CS_LOW();&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;LPSPI0_tx_32bits(header); (void)LPSPI0_rx_32bits();&amp;nbsp; &amp;nbsp; &amp;nbsp;// Write header&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;LPSPI0_tx_32bits(0x00000001); (void)LPSPI0_rx_32bits(); // Write data&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;CS_HIGH();&lt;/DIV&gt;
&lt;DIV&gt;}&lt;/DIV&gt;
&lt;DIV&gt;void lan8650_write_imask0(uint32_t value) {&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;uint32_t header = build_ctrl_header(1, 0x00, 0x000C, 0);&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;CS_LOW();&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;LPSPI0_tx_32bits(header); (void)LPSPI0_rx_32bits();&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;LPSPI0_tx_32bits(value);&amp;nbsp; (void)LPSPI0_rx_32bits();&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;CS_HIGH();&lt;/DIV&gt;
&lt;DIV&gt;}&lt;/DIV&gt;
&lt;DIV&gt;uint32_t lan8650_read_imask0(void) {&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;uint32_t header = build_ctrl_header(0, 0x00, 0x000C, 0);&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;uint32_t data = 0;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;CS_LOW();&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;LPSPI0_tx_32bits(header); (void)LPSPI0_rx_32bits(); // Send header&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;LPSPI0_tx_32bits(0x00000000);&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Dummy to clock data&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;data = LPSPI0_rx_32bits();&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Get data&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;CS_HIGH();&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp;return data;&lt;/DIV&gt;
&lt;DIV&gt;}&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;int main(void) {&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; uint32_t imask_read_value;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; volatile int i;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; // Usual system and SPI setup&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; WDOG_disable();&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; SOSC_init_8MHz();&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; SPLL_init_160MHz();&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; NormalRUNmode_80MHz();&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; PORT_init();&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Configure SPI pins&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; LPSPI0_init_master();&amp;nbsp; // Init LPSPI master&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; // Small delay before starting (optional)&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; for ( i = 0; i &amp;lt; 100000; i++); // Optional delay&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Write RESET&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lan8650_write_reset();&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Optional delay to allow reset to complete&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for ( i = 0; i &amp;lt; 100000; i++);&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Unmask all interrupts&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lan8650_write_imask0(0x00000000);&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Read IMASK0 to verify&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; imask_read_value = lan8650_read_imask0();&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Set breakpoint here to inspect imask_read_value&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while (1) { }&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; return 0;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;}&lt;/DIV&gt;
&lt;P&gt;&lt;BR /&gt;Here, I am trying to Write&amp;nbsp;0x00000000 to IMASK0 register address and trying to readback the same address in order to ensure the value has been written properly. But I got value has 0xC0000001 instead of 0xC0000000. (IMASK0 has 31 to 16 bits as reserved and Read-Only bits thus 0xC000 can be fixed even i try to write it as 0, thus we can neglect that) But the lower 16 bits are R/W and thus it should be 0.&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Muthappan_Viswanthan_1-1744663056405.png" style="width: 400px;"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/332981i0B73CC8202E0409D/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Muthappan_Viswanthan_1-1744663056405.png" alt="Muthappan_Viswanthan_1-1744663056405.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;DIV id="tinyMceEditorMuthappan_Viswanthan_2" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Muthappan_Viswanthan_4-1744663312231.png" style="width: 400px;"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/332982iF50EBF27C60BE06E/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Muthappan_Viswanthan_4-1744663312231.png" alt="Muthappan_Viswanthan_4-1744663312231.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;For debugging purpose, in the above code I set breakpoint in the last while loop and it successfully hits (above picture) thus seems like write and read happening proper (not 100% sure, my assumption) but the value read is wrong.&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;I tried all possibilities and still couldn't find where it went wrong. Kindly guide me to solve this issue.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks in advance.&lt;/P&gt;
&lt;DIV id="tinyMceEditorMuthappan_Viswanthan_3" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 14 Apr 2025 20:49:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2080218#M47753</guid>
      <dc:creator>Muthappan_Viswanthan</dc:creator>
      <dc:date>2025-04-14T20:49:21Z</dc:date>
    </item>
    <item>
      <title>Re: SPI Communication Issue with TC6 SPI Protocol</title>
      <link>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2080474#M47761</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;code looks normal, but I think a protocol looks little bit different. There should be 3 words transferred for single register writing/reading&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PetrS_0-1744696020470.png" style="width: 400px;"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/333061iF6B1DB1FB8EC1A5E/image-size/medium?v=v2&amp;amp;px=400" role="button" title="PetrS_0-1744696020470.png" alt="PetrS_0-1744696020470.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="PetrS_1-1744696028761.png" style="width: 400px;"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/333062i804C86E2A3CA0CA0/image-size/medium?v=v2&amp;amp;px=400" role="button" title="PetrS_1-1744696028761.png" alt="PetrS_1-1744696028761.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;For both read and write, the Control Header sent to the LAN8650/1 over SDI is always echoed back to the SPI host over SDO. When performing control writes, the register data sent over SDI is also echoed back over SDO.&lt;/P&gt;
&lt;P&gt;Thus for write you send header, data, dummy words, For read you send header, dummy, dummy words.&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;So try that, measure SPI lines with scope /analyzer to know real frames. Also check header is correct.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;BR, Petr&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 15 Apr 2025 05:51:41 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2080474#M47761</guid>
      <dc:creator>PetrS</dc:creator>
      <dc:date>2025-04-15T05:51:41Z</dc:date>
    </item>
    <item>
      <title>Re: SPI Communication Issue with TC6 SPI Protocol</title>
      <link>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2084657#M48003</link>
      <description>&lt;P&gt;Thanks for your help so far.&amp;nbsp;&lt;BR /&gt;I made the changes to transfer as 3x 32bit words for both read &amp;amp; write.&lt;/P&gt;
&lt;P&gt;As per the statement from LAN8650 datasheet "&lt;SPAN&gt;When performing control writes, the register data sent over SDI is also echoed back over SDO&lt;/SPAN&gt;", I am not getting echoed data as same as what I transmitted during write and read operations.&lt;/P&gt;
&lt;P&gt;The modified code is as below:&lt;/P&gt;
&lt;P&gt;void lan8650_write_imask0(uint32_t value) {&lt;BR /&gt;uint32_&lt;/P&gt;
&lt;DIV id="tinyMceEditorMuthappan_Viswanthan_1" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;t header = build_ctrl_header(1, 0x00, 0x000C, 0);&lt;BR /&gt;uint32_t read_tx_header2 = 0;&lt;BR /&gt;uint32_t read_tx_data2 = 0;&lt;/P&gt;
&lt;P&gt;CS_LOW();&lt;/P&gt;
&lt;P&gt;LPSPI0_tx_32bits(header); // Write header&lt;BR /&gt;(void)LPSPI0_rx_32bits(); //Read dummy bytes&lt;/P&gt;
&lt;P&gt;LPSPI0_tx_32bits(value); // Write data&lt;BR /&gt;read_tx_header2 = LPSPI0_rx_32bits(); // Read Header Echo&lt;/P&gt;
&lt;P&gt;LPSPI0_tx_32bits(0x00000000); // Write dummy data&lt;BR /&gt;read_tx_data2 = LPSPI0_rx_32bits(); // Read data Echo&lt;/P&gt;
&lt;P&gt;CS_HIGH();&lt;BR /&gt;}&lt;BR /&gt;uint32_t lan8650_read_imask0(void) {&lt;BR /&gt;uint32_t header = build_ctrl_header(0, 0x00, 0x000C, 0);&lt;BR /&gt;uint32_t rx_header = 0;&lt;BR /&gt;uint32_t rx_data = 0;&lt;/P&gt;
&lt;P&gt;CS_LOW();&lt;/P&gt;
&lt;P&gt;LPSPI0_tx_32bits(header); // Send header&lt;BR /&gt;(void)LPSPI0_rx_32bits(); // Dummy data&lt;/P&gt;
&lt;P&gt;LPSPI0_tx_32bits(0x00000000); // Dummy to clock header&lt;BR /&gt;rx_header = LPSPI0_rx_32bits(); // Read Header Echo&lt;/P&gt;
&lt;P&gt;LPSPI0_tx_32bits(0x00000000); // Dummy to clock data&lt;BR /&gt;rx_data = LPSPI0_rx_32bits(); // Read data&lt;/P&gt;
&lt;P&gt;CS_HIGH();&lt;BR /&gt;return rx_data;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P&gt;And I measured the SPI lines of LAN8650 with scope and the observations are:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;1. CS is LOW for the entire duration of 3x 32bits transfer.&lt;/P&gt;
&lt;P&gt;2. SCK not seems to be continuous. After each 32bits transfer SCK is in LOW for some time and then starting back. [&lt;STRONG&gt;Refer below picture channel 2 (green) waveform ]&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;3. SDI line has the same 32bit header, 32 bit data and 32 bit dummy data which I sent from S32K144 MOSI.&lt;/P&gt;
&lt;P&gt;4. SDO echoes "0xC000 0000" during header transmission (Ignored data),&amp;nbsp;&amp;nbsp;"0xC000 0001" during both data &amp;amp; dummy data transmission which expected to be header &amp;amp; data as per datasheet.&lt;/P&gt;
&lt;DIV id="tinyMceEditorMuthappan_Viswanthan_0" class="mceNonEditable lia-copypaste-placeholder"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;The header seems to be correct, example I used "0x30000c00" for IMASK0.&lt;BR /&gt;&lt;BR /&gt;So, whether that delay in SCK between each 32 bits makes an issue?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 22 Apr 2025 13:28:04 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2084657#M48003</guid>
      <dc:creator>Muthappan_Viswanthan</dc:creator>
      <dc:date>2025-04-22T13:28:04Z</dc:date>
    </item>
    <item>
      <title>Re: SPI Communication Issue with TC6 SPI Protocol</title>
      <link>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2086404#M48108</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;a delay in SCK should not be an issue. Check if there are right number of clock periods in words.&lt;BR /&gt;To say more capture full frame in scope/analyzer.&lt;BR /&gt;I guess you have wrong parity bit calculated. You wrote "&lt;SPAN&gt;The header seems to be correct, example I used "0x30000c00" for IMASK0.&lt;/SPAN&gt;" But this time parity bit should be set to have odd number of "1" in header.&lt;/P&gt;
&lt;P&gt;BR, Petr&lt;/P&gt;</description>
      <pubDate>Thu, 24 Apr 2025 08:09:46 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2086404#M48108</guid>
      <dc:creator>PetrS</dc:creator>
      <dc:date>2025-04-24T08:09:46Z</dc:date>
    </item>
    <item>
      <title>Re: SPI Communication Issue with TC6 SPI Protocol</title>
      <link>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2086452#M48110</link>
      <description>&lt;P class=""&gt;Hello,&lt;/P&gt;&lt;P class=""&gt;&amp;nbsp;&lt;/P&gt;&lt;P class=""&gt;I'm responding to your post as I have experience implementing the &lt;STRONG&gt;TC6 protocol using the LAN8651 MAC-PHY chip from Microchip&lt;/STRONG&gt; on the &lt;STRONG&gt;S32K314 MCU&lt;/STRONG&gt;.&lt;/P&gt;&lt;P class=""&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="malove_0-1745485549079.png" style="width: 400px;"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/334694i7BA07573B8918E93/image-size/medium?v=v2&amp;amp;px=400" role="button" title="malove_0-1745485549079.png" alt="malove_0-1745485549079.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P class=""&gt;In my case, I used &lt;STRONG&gt;RTD 4.0.0&lt;/STRONG&gt; with &lt;STRONG&gt;S32 Design Studio 3.5&lt;/STRONG&gt;, and configured the &lt;STRONG&gt;LPSPI driver&lt;/STRONG&gt; as follows.&lt;/P&gt;&lt;P class=""&gt;&amp;nbsp;&lt;/P&gt;&lt;P class=""&gt;Based on this LPSPI driver, you should be able to configure a uint8_t tx and rx buffer with 12 elements and perform SPI communication accordingly.&lt;/P&gt;&lt;P class=""&gt;ex) uint8_t spiRxBuffer[12], uint8_t spiTxBuffer[12]&lt;/P&gt;</description>
      <pubDate>Thu, 24 Apr 2025 09:06:37 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2086452#M48110</guid>
      <dc:creator>malove</dc:creator>
      <dc:date>2025-04-24T09:06:37Z</dc:date>
    </item>
    <item>
      <title>Re: SPI Communication Issue with TC6 SPI Protocol</title>
      <link>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2086501#M48116</link>
      <description>Hi, &lt;BR /&gt;Finally its working and the issue is with header as you stated. Actually, I read like we should set the parity bit to "1'" if we have odd number of 1's between bit 31:1 and thus in my case I didnt set it. After your comment I just deep dive into it and got to know that my understanding is wrong. Thanks for lightning up.!</description>
      <pubDate>Thu, 24 Apr 2025 09:58:49 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2086501#M48116</guid>
      <dc:creator>Muthappan_Viswanthan</dc:creator>
      <dc:date>2025-04-24T09:58:49Z</dc:date>
    </item>
    <item>
      <title>Re: SPI Communication Issue with TC6 SPI Protocol</title>
      <link>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2086567#M48121</link>
      <description>Thanks for your reply. Rightnow, Iam using older version of S32 DS and doing baremetal programming. But thought of switching to newer version and using RTD, this might helpful for me in that case. Thanks again!</description>
      <pubDate>Thu, 24 Apr 2025 11:20:59 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2086567#M48121</guid>
      <dc:creator>Muthappan_Viswanthan</dc:creator>
      <dc:date>2025-04-24T11:20:59Z</dc:date>
    </item>
    <item>
      <title>Re: SPI Communication Issue with TC6 SPI Protocol</title>
      <link>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2086925#M48143</link>
      <description>&lt;P&gt;Hello&amp;nbsp;&lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/249129"&gt;@Muthappan_Viswanthan&lt;/a&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P class=""&gt;I'm really glad to hear that I was able to help for a change, since I'm usually the one receiving help.&lt;/P&gt;&lt;P class=""&gt;&amp;nbsp;&lt;/P&gt;&lt;P class=""&gt;If you have any further questions, feel free to leave a reply &lt;LI-EMOJI id="lia_slightly-smiling-face" title=":slightly_smiling_face:"&gt;&lt;/LI-EMOJI&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 24 Apr 2025 22:58:59 GMT</pubDate>
      <guid>https://community.nxp.com/t5/S32K/SPI-Communication-Issue-with-TC6-SPI-Protocol/m-p/2086925#M48143</guid>
      <dc:creator>malove</dc:creator>
      <dc:date>2025-04-24T22:58:59Z</dc:date>
    </item>
  </channel>
</rss>

