<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Could not make SPI HCI work on Zephyr 4.3.0 with nRF54L15</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/126031/could-not-make-spi-hci-work-on-zephyr-4-3-0-with-nrf54l15</link><description>Hello, I&amp;#39;m trying to make samples/bluetooth/hci_spi work on my nRF54L15-DK however I encounter some issues My device tree overlay is as followed: 
 
 I know that spi21.def-char should be &amp;lt;0x00&amp;gt; however for my test purpose it helps me to diagnose my SPI</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Mon, 05 Jan 2026 09:34:31 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/126031/could-not-make-spi-hci-work-on-zephyr-4-3-0-with-nrf54l15" /><item><title>RE: Could not make SPI HCI work on Zephyr 4.3.0 with nRF54L15</title><link>https://devzone.nordicsemi.com/thread/557892?ContentTypeID=1</link><pubDate>Mon, 05 Jan 2026 09:34:31 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:785ac3a8-26b9-4c16-93dd-96b71b3ca3fa</guid><dc:creator>Robyn</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT2:&lt;/strong&gt; Thank to all your information I was able to diagnose the underlying issue and I&amp;#39;m finally able to make both cards communicate without any issues.&lt;/p&gt;
&lt;p&gt;I&amp;#39;m really grateful for the time you took to help me,&lt;/p&gt;
&lt;p&gt;Robyn&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Previous Answer:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I enabled the config flag you mentionned and got&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;ASSERTION FAIL [err == 0] @ WEST_TOPDIR/zephyr/subsys/bluetooth/host/hci_core.c:504
        Controller unresponsive, command opcode 0x2022 timeout with err -11
[00:00:11.628,000] &amp;lt;err&amp;gt; os: r0/a1:  0x00000003  r1/a2:  0x00000000  r2/a3:  0x00000002
[00:00:11.628,000] &amp;lt;err&amp;gt; os: r3/a4:  0x00000003 r12/ip:  0x00002d6c r14/lr:  0x34185413
[00:00:11.628,000] &amp;lt;err&amp;gt; os:  xpsr:  0x01000000
[00:00:11.628,000] &amp;lt;err&amp;gt; os: Faulting instruction address (r15/pc): 0x34185422
[00:00:11.628,000] &amp;lt;err&amp;gt; os: &amp;gt;&amp;gt;&amp;gt; ZEPHYR FATAL ERROR 3: Kernel oops on CPU 0
[00:00:11.628,000] &amp;lt;err&amp;gt; os: Current thread: 0x3419a488 (BT RX WQ)
[00:00:11.666,000] &amp;lt;err&amp;gt; os: Halting system
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Which seems to make it clear that it is caused by the following warnings that I have&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;&amp;lt;wrn&amp;gt; bt_hci_core: opcode 0x2022 status 0x01 BT_HCI_ERR_UNKNOWN_CMD&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT1:&lt;/strong&gt; After some research I discovered that it was because the&amp;nbsp;BT_HCI_OP_LE_SET_DATA_LEN was not understood but the following configuration was missing on the nRF54 and so the command failed. After fixing the configuratuib the warning disappear.&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;CONFIG_BT_DATA_LEN_UPDATE=y&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration:line-through;"&gt;However some issues still persists after that, I&amp;#39;ve got the following error followed promptly by different crashes, each time after the following error&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT2&lt;/strong&gt;: The cause was my debug default char being set to 117 which caused the following issue.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;&amp;lt;err&amp;gt; bt_driver: Unknown BT buf type 117&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;[00:00:01.531,000] &amp;lt;err&amp;gt; bt_driver: Unknown BT buf type 117
[00:00:04.491,000] &amp;lt;wrn&amp;gt; bt_conn: conn 0x3419aa30 failed to establish. RF noise?
[00:00:04.492,000] &amp;lt;wrn&amp;gt; bt_conn: conn 0x3419ab00 failed to establish. RF noise?
ASSERTION FAIL [err == 0] @ WEST_TOPDIR/zephyr/subsys/bluetooth/host/hci_core.c:504
        Controller unresponsive, command opcode 0x200e timeout with err -11
[00:00:14.473,000] &amp;lt;err&amp;gt; os: r0/a1:  0x00000003  r1/a2:  0x00000000  r2/a3:  0x00000002
[00:00:14.473,000] &amp;lt;err&amp;gt; os: r3/a4:  0x00000003 r12/ip:  0x00003889 r14/lr:  0x3418540b
[00:00:14.473,000] &amp;lt;err&amp;gt; os:  xpsr:  0x01000000
[00:00:14.473,000] &amp;lt;err&amp;gt; os: Faulting instruction address (r15/pc): 0x3418541a
[00:00:14.473,000] &amp;lt;err&amp;gt; os: &amp;gt;&amp;gt;&amp;gt; ZEPHYR FATAL ERROR 3: Kernel oops on CPU 0
[00:00:14.473,000] &amp;lt;err&amp;gt; os: Current thread: 0x3419b550 (sysworkq)
[00:00:14.511,000] &amp;lt;err&amp;gt; os: Halting system
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;[00:00:02.957,000] &amp;lt;err&amp;gt; bt_driver: Unknown BT buf type 117
[00:00:31.554,000] &amp;lt;err&amp;gt; bt_att: ATT Timeout for device F4:12:FA:86:7B:79 (public). Disconnecting...
[00:00:31.571,000] &amp;lt;wrn&amp;gt; bt_conn: conn 0x3419a960 failed to establish. RF noise?
ASSERTION FAIL [err == 0] @ WEST_TOPDIR/zephyr/subsys/bluetooth/host/hci_core.c:504
        Controller unresponsive, command opcode 0x0406 timeout with err -11
[00:00:41.554,000] &amp;lt;err&amp;gt; os: r0/a1:  0x00000003  r1/a2:  0x00000000  r2/a3:  0x00000002
[00:00:41.554,000] &amp;lt;err&amp;gt; os: r3/a4:  0x00000003 r12/ip:  0x0000a252 r14/lr:  0x3418540b
[00:00:41.554,000] &amp;lt;err&amp;gt; os:  xpsr:  0x01000000
[00:00:41.554,000] &amp;lt;err&amp;gt; os: Faulting instruction address (r15/pc): 0x3418541a
[00:00:41.554,000] &amp;lt;err&amp;gt; os: &amp;gt;&amp;gt;&amp;gt; ZEPHYR FATAL ERROR 3: Kernel oops on CPU 0
[00:00:41.554,000] &amp;lt;err&amp;gt; os: Current thread: 0x3419b550 (sysworkq)
[00:00:41.592,000] &amp;lt;err&amp;gt; os: Halting system
&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Could not make SPI HCI work on Zephyr 4.3.0 with nRF54L15</title><link>https://devzone.nordicsemi.com/thread/557864?ContentTypeID=1</link><pubDate>Sun, 04 Jan 2026 19:34:20 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:b513e4ce-f215-4c6e-8352-974c11646d02</guid><dc:creator>Susheel Nuguru</dc:creator><description>&lt;p&gt;Happy new year Robyn, thanks for your patience in waiting and glad that you had a lot of process in figuring out why the SPI was not working.&lt;/p&gt;
&lt;p&gt;The assert you see here,&amp;nbsp;does not give much context.&lt;/p&gt;
&lt;p&gt;Can you please enable these configs if you have not already, to know the context of this fault.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;CONFIG_THREAD_NAME
CONFIG_STACK_SENTINEL
CONFIG_THREAD_ANALYZER&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;These give you context of the fault and also more info on the thread stacks in case this is a stack overflow issue.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Could not make SPI HCI work on Zephyr 4.3.0 with nRF54L15</title><link>https://devzone.nordicsemi.com/thread/557575?ContentTypeID=1</link><pubDate>Tue, 23 Dec 2025 12:07:15 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:30a7d92b-1ad1-48bb-8385-147662a2f016</guid><dc:creator>Robyn</dc:creator><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;p&gt;After some research I finally figured out why the communication didn&amp;#39;t worked...&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I had&amp;nbsp;&lt;strong&gt;spi-hold-cs&lt;/strong&gt;&amp;nbsp;selected for SPI preventing the communication from working.&lt;/p&gt;
&lt;p&gt;This allows to pass the&amp;nbsp;&lt;strong&gt;bt_enable&amp;nbsp;&lt;/strong&gt;however I still got some errors along the way which completely stop the scan.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:monospace;"&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;...&lt;br /&gt;[SCAN] Started&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;[00:00:01.187,000] &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;&amp;lt;err&amp;gt; bt_driver: Unknown BT buf type 117&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;[00:00:30.549,000] &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;&amp;lt;err&amp;gt; bt_att: ATT Timeout for device 18:8B:0E:B0:A7:F6 (public). Disconnecting...&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;[00:00:30.563,000] &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;&amp;lt;wrn&amp;gt; bt_hci_core: opcode 0x2022 status 0x01 BT_HCI_ERR_UNKNOWN_CMD&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style="background-color:#1f1f1f;color:#cccccc;font-family:&amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-size:14px;font-weight:normal;line-height:19px;white-space:pre;"&gt;
&lt;div&gt;&lt;span style="color:#569cd6;"&gt;static&lt;/span&gt;&lt;span style="color:#cccccc;"&gt; &lt;/span&gt;&lt;span style="color:#569cd6;"&gt;int&lt;/span&gt;&lt;span style="color:#cccccc;"&gt; &lt;/span&gt;&lt;span style="color:#dcdcaa;"&gt;central_start_scan&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;(&lt;/span&gt;&lt;span style="color:#569cd6;"&gt;void&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:#cccccc;"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:#569cd6;"&gt; int&lt;/span&gt;&lt;span style="color:#cccccc;"&gt; &lt;/span&gt;&lt;span style="color:#9cdcfe;"&gt;err&lt;/span&gt;&lt;span style="color:#cccccc;"&gt; &lt;/span&gt;&lt;span style="color:#d4d4d4;"&gt;=&lt;/span&gt;&lt;span style="color:#cccccc;"&gt; &lt;/span&gt;&lt;span style="color:#dcdcaa;"&gt;bt_le_scan_start&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;(&lt;/span&gt;&lt;span style="color:#d4d4d4;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#9cdcfe;"&gt;scan_param&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;, &lt;/span&gt;&lt;span style="color:#dcdcaa;"&gt;central_device_found&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:#cccccc;"&gt; &lt;/span&gt;&lt;span style="color:#c586c0;"&gt;if&lt;/span&gt;&lt;span style="color:#cccccc;"&gt; (&lt;/span&gt;&lt;span style="color:#9cdcfe;"&gt;err&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:#cccccc;"&gt; &lt;/span&gt;&lt;span style="color:#dcdcaa;"&gt;printk&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;(&lt;/span&gt;&lt;span style="color:#ce9178;"&gt;&amp;quot;[SCAN] Failed (err &lt;/span&gt;&lt;span style="color:#9cdcfe;"&gt;%d&lt;/span&gt;&lt;span style="color:#ce9178;"&gt;)&lt;/span&gt;&lt;span style="color:#d7ba7d;"&gt;\n&lt;/span&gt;&lt;span style="color:#ce9178;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;, &lt;/span&gt;&lt;span style="color:#9cdcfe;"&gt;err&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:#cccccc;"&gt; &lt;/span&gt;&lt;span style="color:#c586c0;"&gt;return&lt;/span&gt;&lt;span style="color:#cccccc;"&gt; &lt;/span&gt;&lt;span style="color:#9cdcfe;"&gt;err&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:#cccccc;"&gt; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:#cccccc;"&gt; &lt;/span&gt;&lt;span style="color:#dcdcaa;"&gt;printk&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;(&lt;/span&gt;&lt;span style="color:#ce9178;"&gt;&amp;quot;[SCAN] Started&lt;/span&gt;&lt;span style="color:#d7ba7d;"&gt;\n&lt;/span&gt;&lt;span style="color:#ce9178;"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:#cccccc;"&gt; &lt;/span&gt;&lt;span style="color:#c586c0;"&gt;return&lt;/span&gt;&lt;span style="color:#cccccc;"&gt; &lt;/span&gt;&lt;span style="color:#b5cea8;"&gt;0&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color:#cccccc;"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But also&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:monospace;"&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;[CONNECT] 18:8B:0E:B0:B4:4A (public) TEST&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;[00:00:01.574,000] &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;&amp;lt;err&amp;gt; bt_driver: Unknown BT buf type 117&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;ASSERTION FAIL [err == 0] @ WEST_TOPDIR/zephyr/subsys/bluetooth/host/hci_core.c:504&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;Controller unresponsive, command opcode 0x200d timeout with err -11&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;[00:00:11.573,000] &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;&amp;lt;err&amp;gt; os: r0/a1: &amp;nbsp;0x00000003 &amp;nbsp;r1/a2: &amp;nbsp;0x00000000 &amp;nbsp;r2/a3: &amp;nbsp;0x00000002&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;[00:00:11.573,000] &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;&amp;lt;err&amp;gt; os: r3/a4: &amp;nbsp;0x00000003 r12/ip: &amp;nbsp;0x00002d35 r14/lr: &amp;nbsp;0x341853e3&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;[00:00:11.573,000] &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;&amp;lt;err&amp;gt; os: &amp;nbsp;xpsr: &amp;nbsp;0x01000000&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;[00:00:11.573,000] &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;&amp;lt;err&amp;gt; os: Faulting instruction address (r15/pc): 0x341853f2&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;[00:00:11.573,000] &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;&amp;lt;err&amp;gt; os: &amp;gt;&amp;gt;&amp;gt; ZEPHYR FATAL ERROR 3: Kernel oops on CPU 0&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;[00:00:11.573,000] &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;&amp;lt;err&amp;gt; os: Current thread: 0x3419a1e0 (unknown)&lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt;[00:00:11.611,000] &lt;/span&gt;&lt;span style="background-color:#ffffff;color:#000000;font-weight:bold;"&gt;&amp;lt;err&amp;gt; os: Halting system&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color:#ffffff;color:#000000;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Could not make SPI HCI work on Zephyr 4.3.0 with nRF54L15</title><link>https://devzone.nordicsemi.com/thread/557420?ContentTypeID=1</link><pubDate>Fri, 19 Dec 2025 11:00:48 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:0232292a-ed91-48cc-902a-fc0c5b4cd60b</guid><dc:creator>Robyn</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;I can confirm that the configuration for the Nucleo correctly applies&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I checked it with a simple program displaying the IRQ GPIO input value and it match what is described in the overlay.&lt;/p&gt;
&lt;p&gt;PS: If you want to reproduce, this is the current circuit I use with&amp;nbsp;Nucleo N657X0-Q and nRF54L15-DK&lt;/p&gt;
&lt;p&gt;&lt;img style="max-height:240px;max-width:320px;" alt=" " src="https://devzone.nordicsemi.com/cfs-file/__key/communityserver-discussions-components-files/4/eutrain_2D00_nrf.svg" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Could not make SPI HCI work on Zephyr 4.3.0 with nRF54L15</title><link>https://devzone.nordicsemi.com/thread/557399?ContentTypeID=1</link><pubDate>Fri, 19 Dec 2025 07:26:05 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:72b7d5dd-ac17-47e4-a7d8-220ef3ca6c0a</guid><dc:creator>Susheel Nuguru</dc:creator><description>&lt;p&gt;Great work Robyn, you seems to have tracked the right root cause for this. The master seems to keep the CS asserted through both phases, so the slave never exits it completion and that seems to make the zephyr HCI handshake deadlock or timeout.&amp;nbsp;re&amp;nbsp;&lt;span&gt;check the Nucleo overlay so the IRQ GPIO is flagged&amp;nbsp;&lt;/span&gt;&lt;span&gt;GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN.&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Could not make SPI HCI work on Zephyr 4.3.0 with nRF54L15</title><link>https://devzone.nordicsemi.com/thread/557249?ContentTypeID=1</link><pubDate>Wed, 17 Dec 2025 15:46:09 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:e42543ea-8694-4b30-8f60-cd8367c40386</guid><dc:creator>Robyn</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Thank you for your feedback&amp;nbsp;&lt;span class="emoticon" data-url="https://devzone.nordicsemi.com/cfs-file/__key/system/emoji/1f642.svg" title="Slight smile"&gt;&amp;#x1f642;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;After some investigation I got some news.&lt;/p&gt;
&lt;p&gt;The communication broke apart when using the&amp;nbsp;&amp;nbsp;&amp;quot;&lt;strong&gt;zephyr,bt-hci-spi&lt;/strong&gt;&amp;quot; driver for the master in front of the example &lt;strong&gt;spi_hci&lt;/strong&gt;&amp;nbsp;with the driver&amp;nbsp;&amp;quot;&lt;strong&gt;zephyr,bt-hci-spi-slave&lt;/strong&gt;&amp;quot; for the slave.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;On the slave, in file &lt;strong&gt;zephyr/samples/bluetooth/hci_spi/src/main.c&lt;/strong&gt; in function &lt;strong&gt;bt_tx_thread&amp;nbsp;&lt;/strong&gt;prepare the following payload to be transferred and wait for transfer:
&lt;div style="background-color:#1f1f1f;color:#cccccc;font-family:&amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-size:14px;font-weight:normal;line-height:19px;white-space:pre;"&gt;
&lt;div&gt;&lt;span style="color:#cccccc;"&gt;{ &lt;/span&gt;&lt;span style="color:#569cd6;"&gt;READY_NOW&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;, &lt;/span&gt;&lt;span style="color:#569cd6;"&gt;SANITY_CHECK&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;, &lt;/span&gt;&lt;span style="color:#b5cea8;"&gt;0x00&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;, &lt;/span&gt;&lt;span style="color:#b5cea8;"&gt;0x00&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;, &lt;/span&gt;&lt;span style="color:#b5cea8;"&gt;0x00&lt;/span&gt;&lt;span style="color:#cccccc;"&gt; }&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;On the host &lt;strong&gt;bt_enable&lt;/strong&gt;&amp;nbsp;&lt;strong&gt;&lt;/strong&gt;which goes into zephyr/drivers/bluetooth/hci/spi.c and once in bt_spi_rx_thread cause it to call&amp;nbsp;
&lt;div style="background-color:#1f1f1f;color:#cccccc;font-family:&amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-size:14px;font-weight:normal;line-height:19px;white-space:pre;"&gt;
&lt;div&gt;&lt;span style="color:#dcdcaa;"&gt;bt_spi_get_header&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;(&lt;/span&gt;&lt;span style="color:#569cd6;"&gt;SPI_READ&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;, &lt;/span&gt;&lt;span style="color:#d4d4d4;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#9cdcfe;"&gt;size&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Preparing the following payload to be transferred&lt;/p&gt;
&lt;div style="background-color:#1f1f1f;color:#cccccc;font-family:&amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-size:14px;font-weight:normal;line-height:19px;white-space:pre;"&gt;
&lt;div&gt;&lt;span style="color:#cccccc;"&gt;{ &lt;/span&gt;&lt;span style="color:#569cd6;"&gt;SPI_READ&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;, &lt;/span&gt;&lt;span style="color:#cccccc;"&gt;&lt;span style="color:#b5cea8;"&gt;0x00&lt;/span&gt;, &lt;/span&gt;&lt;span style="color:#b5cea8;"&gt;0x00&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;, &lt;/span&gt;&lt;span style="color:#b5cea8;"&gt;0x00&lt;/span&gt;&lt;span style="color:#cccccc;"&gt;, &lt;/span&gt;&lt;span style="color:#b5cea8;"&gt;0x00&lt;/span&gt;&lt;span style="color:#cccccc;"&gt; }&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;On the host&amp;nbsp;bt_spi_get_header start the transfer which puts CS low and transceive 5 bytes&lt;/li&gt;
&lt;li&gt;The slave receives the host message but cannot leave&amp;nbsp;&lt;strong&gt;spi_context_wait_for_completion&amp;nbsp;&lt;/strong&gt;before CS is put back high&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The master still in &lt;strong&gt;bt_spi_get_header&lt;/strong&gt; receive the package from the slave check for byte 3 (STATUS_HEADER_TOREAD) to be different than 0 as this would mean receiving no data. As the received packet does contains 0 at this place it retries to transfer 5 bytes to get a packet with correct content&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The slave SPI does not have any data to transfer and switch to keeping MISO high instead&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;The master receive a packet containing 0xFF five times, which fails its check that the packet 1st byte (STATUS_HEADER_READY) is&amp;nbsp;READY_NOW (0x02). This check fails so the master tries to transfer 5 bytes which result in 4.2 again&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This means at this point that:&lt;/p&gt;
&lt;p&gt;- The slave wait for CS being put high again&lt;/p&gt;
&lt;p&gt;- The master looping in 5 bytes transfer as it does not receive a valid payload&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Things that might be the cause&lt;/p&gt;
&lt;p&gt;- Master should release CS between those transfers ? (need a fix on &amp;quot;&lt;strong&gt;zephyr/drivers/bluetooth/hci/spi.c&lt;/strong&gt;&amp;quot;)&lt;/p&gt;
&lt;p&gt;- Slave transfer should not always wait for CS to go up ?&amp;nbsp;(need a fix on &amp;quot;&lt;strong&gt;zephyr/drivers/spi/spi_nrfx_spis.c&lt;/strong&gt;&amp;quot;)&lt;/p&gt;
&lt;p&gt;- Or am I missing some code which should be run before ? (need a fix on my code which for now only call &lt;strong&gt;bt_enable&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;I would appreciate any help on this issue.&lt;/p&gt;
&lt;p&gt;If possible, to prevent further error from other people it would be beneficial to have a full example with both master and slave for the &lt;strong&gt;hci_spi&amp;nbsp;&lt;/strong&gt;example. If we fix this issue I might be able to do it.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;=== Old Answer ===&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DMA&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;nbsp;When you are working with the nRF54L15 you have to make sure that each SPIS instance has its own DMA buffer region defined. You do this by using the memory-regions option and setting it to the cpuapp_dma_region. If you do not do this the spi_transceive function will fail every time even before it gets to the part. This is something you need to do for each SPIS instance on the nRF54L15.&lt;/p&gt;
&lt;p&gt;For the DMA part, the only example I see is under nRF54H20-DK or nRF9280. Is there no configuration about that by default on the nRF54L15-DK board I could use ? If it is required, would you mind doing an example based on the overlay from my first message ?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Host Driver Issue&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;nbsp;Your master needs to use the Zephyr BT SPI host driver, which&amp;#39;s the Zephyr BT SPI host driver. The Zephyr BT SPI host driver already has what you need it has the two-step handshake, with the CS toggling and it handles the IRQ correctly.&lt;/p&gt;
&lt;p&gt;I&amp;#39;m already trying that. As it seems something is wrong with the master let me explain you the full setup&lt;/p&gt;
&lt;p&gt;I&amp;#39;m trying to use a Nucleo N657X0-Q with the nRF54L15 as a Bluetooth chip. I first tried with the X-NUCLEO-BNRG2A1, which contains a BlueNRG, but the BlueNRG seems to not fit to our use case.&lt;/p&gt;
&lt;p&gt;As such the BlueNRG also communicate via SPI, Reset, IRQ pin I thought I would be easier to communicate with the nRF54 in SPI too with a configuration very similar to the BlueNRG one.&lt;/p&gt;
&lt;p&gt;For the BlueNRG I got the following overlay&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;#include &amp;lt;zephyr/dt-bindings/gpio/arduino-header-r3.h&amp;gt;

/ {
	chosen {
		zephyr,bt-hci = &amp;amp;hci_spi;
	};
};

&amp;amp;arduino_spi {
	cs-gpios = &amp;lt;&amp;amp;arduino_header ARDUINO_HEADER_R3_D4 GPIO_ACTIVE_LOW&amp;gt;;

	hci_spi: bluenrg-2@0 {
		compatible = &amp;quot;st,hci-spi-v2&amp;quot;;
		reg = &amp;lt;0&amp;gt;;
		reset-gpios = &amp;lt;&amp;amp;arduino_header ARDUINO_HEADER_R3_D7 GPIO_ACTIVE_LOW&amp;gt;;
		irq-gpios = &amp;lt;&amp;amp;arduino_header ARDUINO_HEADER_R3_A0
			     (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)&amp;gt;;
		/* spi-cpha; CPHA=1 */
		spi-hold-cs;
		spi-max-frequency = &amp;lt;DT_FREQ_M(1)&amp;gt;;
		reset-assert-duration-ms = &amp;lt;6&amp;gt;;
	};
};&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;It is almost the same as the one from boards/shields/x_nucleo_bnrg2a1/x_nucleo_bnrg2a1.overlay with the only difference being the CS pin being switched to another as it does not seem to natively work otherwise.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;With that device tree and a small patch to some ST SPI driver&amp;nbsp;&lt;a id="" href="https://github.com/zephyrproject-rtos/zephyr/pull/100180"&gt;https://github.com/zephyrproject-rtos/zephyr/pull/100180&lt;/a&gt;&amp;nbsp;I&amp;#39;m able to communicate with the BlueNRG without any issue.&lt;/p&gt;
&lt;p&gt;From there I just replaced &amp;quot;st,hci-spi-v2&amp;quot; by&amp;nbsp;&amp;nbsp;&amp;quot;&lt;strong&gt;zephyr,bt-hci-spi&lt;/strong&gt;&amp;quot; and the plugged the nRF54L15-DK instead of the&amp;nbsp;X-NUCLEO-BNRG2A1 &lt;strong&gt;EDIT: And commented spi-cpha&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Which make me think I&amp;#39;m using the correct driver and as the SPI, IRQ, Reset of the Nucleo&amp;nbsp;N657X0 were working with the BlueNRG I don&amp;#39;t see any reason there that it should not work on the nRF54&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IRQ&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;gt;&amp;nbsp;To make sure everything works correctly we need to keep the IRQ wiring the same as it&amp;#39;s in the devicetree. This means it should be active-high, with a pull-down.&amp;nbsp;The master has to pay attention to that line. It should only start the transaction when the IRQ actually goes high. We are talking about the IRQ so the master needs to wait for the IRQ to go high before it starts the next transaction, which is the second transaction.&lt;/p&gt;
&lt;p&gt;As the IRQ for&amp;nbsp;boards/shields/x_nucleo_bnrg2a1/x_nucleo_bnrg2a1.overlay is already setup with the correct setup I don&amp;#39;t think this is the issue. And as seen on both image the transaction only start once IRQ is high&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Clarification on CS and RESET&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Additionally on the second picture the displayed CS is the output of the host which is not connected to the nRF54, as this is the case were I plug nRF54 CS to ground if I did not properly convey it.&lt;/p&gt;
&lt;p&gt;Also to re-contextualize those screenshots they represent the first exchange after reset which means that on both screenshot the IRQ going high is due to the nRF54 having finished its reset and telling the master that it is ready to receive commands.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Signals&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Also this does not explain on the first picture why does the MISO seems to start outputting data without any clock on the first picture once CS goes down (which is weird and does not appear if CS stay down which was the second picture), even if in this case it does not seems to cause any issue in the communication.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I agree with your conclusion that the master misbehave, but the things that bugs me is that I think I use the correct driver (&lt;strong&gt;zephyr,bt-hci-spi)&lt;/strong&gt;, so the question is now why does this happens ?&lt;/p&gt;
&lt;p&gt;- Configuration, except for the DMA part I don&amp;#39;t see anything which seems incorrect to me&lt;/p&gt;
&lt;p&gt;- Initialization, does&amp;nbsp;&lt;strong&gt;zephyr,bt-hci-spi&amp;nbsp;&lt;/strong&gt;require some initialization which I forgot to add ? If that so is there any example I can base myself on ?&lt;/p&gt;
&lt;p&gt;- Another drivers issue on the Nucleo ?&lt;/p&gt;
&lt;p&gt;I will try to investigate further.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Could not make SPI HCI work on Zephyr 4.3.0 with nRF54L15</title><link>https://devzone.nordicsemi.com/thread/557175?ContentTypeID=1</link><pubDate>Wed, 17 Dec 2025 09:27:12 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:a189bee8-a3bd-4788-b49c-0827b64c0350</guid><dc:creator>Susheel Nuguru</dc:creator><description>&lt;p&gt;Hi Robyn,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Sorry for the late reply.&lt;/p&gt;
&lt;p&gt;My understanding here is that the slave firmware is doing everything it is supposed to do. The problem is, with the SPI master firmware. It is not finishing the two-phase handshake that the sample code is expecting from the Zephyr HCI-SPI code and our SPI master. The Zephyr HCI-SPI code is waiting for this handshake to be completed by our SPI master.&lt;/p&gt;
&lt;p&gt;In&amp;nbsp;&lt;span title="zephyr/samples/bluetooth/hci_spi/src/main.c"&gt;zephyr/samples/bluetooth/hci_spi/src/main.c&lt;/span&gt;&amp;nbsp;the controller sends data to the host through&amp;nbsp;spi_send()&amp;nbsp;(lines 103‑148). The TX thread (bt_tx_thread, lines 150‑246) loops forever doing 5‑byte header exchanges with the host. Only when it sees the host issue a&amp;nbsp;READ&amp;nbsp;request (header_master[0] == SPI_READ/0x0B) does it release&amp;nbsp;sem_spi_tx, so that&amp;nbsp;spi_send()&amp;nbsp;can run its own header exchange and then push the payload.&amp;nbsp;The Nordic HCI SPI transport always needs two transactions where the chip select&amp;#39;s low, for every single packet of the Nordic Zephyr HCI SPI transport.&lt;/p&gt;
&lt;p&gt;The master asserts CS, clocks out five bytes, and reads the slave header (byte 0 =&amp;nbsp;READY_NOW/0x02, byte 3 = payload length). Once those five bytes are in, CS must go high so the slave can prepare the payload.&amp;nbsp;When the payload is ready the slave raises Interrupt Request. The master then makes Chip Select active again sends a 0x0B which means read on the Master Out Slave In line and clocks out the payload bytes which are 04 ff 02 01 00, for the initialized event. Only after this second transfer happens the slave drops Interrupt Request. Goes back to idle state waiting for the next command.&lt;/p&gt;
&lt;p&gt;When you look at the Saleae captures you see that the master is keeping the Chip Select low. It is sending the bytes 0x0B. Some extra bytes, but it never lets go of the line between the header and the payload. This means the slave gets stuck, in the header state and never moves on. The function spi_send gets stuck in a loop waiting for something to happen. The Interrupt line just stays high. All you see on the MISO line is the header byte, which&amp;#39;s either 0x02 or the test character 0x75 repeating over and over. When the Computer System is grounded it makes the Serial Peripheral Interface System peripheral send out the default character all the time. This is what the Serial Peripheral Interface System peripheral should be doing when it is not busy with a request from the Computer System. The Computer System and the Serial Peripheral Interface System peripheral work together, in this way.&lt;/p&gt;
&lt;p&gt;So thinking about how to move forward with this.&lt;/p&gt;
&lt;p&gt;Your master needs to use the Zephyr BT SPI host driver, which&amp;#39;s the Zephyr BT SPI host driver. The Zephyr BT SPI host driver already has what you need it has the two-step handshake, with the CS toggling and it handles the IRQ correctly.&lt;/p&gt;
&lt;p&gt;If you still want to do bit-banging you have to do it right. First you have to read the 5-byte header then you have to deassert the CS then you have to wait for the IRQ then you have to reassert the CS and send 0x0B to get the payload from the Zephyr BT SPI host driver.&lt;/p&gt;
&lt;p&gt;To make sure everything works correctly we need to keep the IRQ wiring the same as it&amp;#39;s in the devicetree. This means it should be active-high, with a pull-down.&lt;/p&gt;
&lt;p&gt;The master has to pay attention to that line. It should only start the transaction when the IRQ actually goes high. We are talking about the IRQ so the master needs to wait for the IRQ to go high before it starts the next transaction, which is the second transaction.&lt;/p&gt;
&lt;p&gt;When you are working with the nRF54L15 you have to make sure that each SPIS instance has its own DMA buffer region defined. You do this by using the memory-regions option and setting it to the cpuapp_dma_region. If you do not do this the spi_transceive function will fail every time even before it gets to the part. This is something you need to do for each SPIS instance on the nRF54L15.&lt;/p&gt;
&lt;p&gt;Once the master follows the handshake, the vendor event&amp;nbsp;should come.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>