{"id":516,"date":"2024-07-26T10:52:29","date_gmt":"2024-07-26T01:52:29","guid":{"rendered":"https:\/\/rtlearner.com\/?p=516"},"modified":"2025-11-13T11:13:21","modified_gmt":"2025-11-13T02:13:21","slug":"lin-ip-verification","status":"publish","type":"post","link":"https:\/\/rtlearner.com\/en\/lin-ip-verification\/","title":{"rendered":"[LIN] 3 IP \uac80\uc99d(verification)"},"content":{"rendered":"<p class=\"wp-block-paragraph\">After months of work on the LIN controller IP RTL design, I'm now working on a checklist for verification. I'll try to summarize it in this post. If you have any suggestions for revisions, please email me!<\/p>\n\n\n<style>.kb-table-of-content-nav.kb-table-of-content-id516_5c65ba-49 .kb-table-of-content-wrap{padding-top:var(--global-kb-spacing-sm, 1.5rem);padding-right:var(--global-kb-spacing-sm, 1.5rem);padding-bottom:var(--global-kb-spacing-sm, 1.5rem);padding-left:var(--global-kb-spacing-sm, 1.5rem);box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}.kb-table-of-content-nav.kb-table-of-content-id516_5c65ba-49 .kb-table-of-contents-title-wrap{padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.kb-table-of-content-nav.kb-table-of-content-id516_5c65ba-49 .kb-table-of-contents-title{font-weight:regular;font-style:normal;}.kb-table-of-content-nav.kb-table-of-content-id516_5c65ba-49 .kb-table-of-content-wrap .kb-table-of-content-list{font-weight:regular;font-style:normal;margin-top:var(--global-kb-spacing-sm, 1.5rem);margin-right:0px;margin-bottom:0px;margin-left:0px;}@media all and (max-width: 767px){.kb-table-of-content-nav.kb-table-of-content-id516_5c65ba-49 .kb-table-of-contents-title{font-size:var(--global-kb-font-size-md, 1.25rem);}.kb-table-of-content-nav.kb-table-of-content-id516_5c65ba-49 .kb-table-of-content-wrap .kb-table-of-content-list{font-size:var(--global-kb-font-size-sm, 0.9rem);}}<\/style>\n\n<style>.kadence-column516_77952c-1d > .kt-inside-inner-col{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}.kadence-column516_77952c-1d > .kt-inside-inner-col,.kadence-column516_77952c-1d > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column516_77952c-1d > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column516_77952c-1d > .kt-inside-inner-col{flex-direction:column;}.kadence-column516_77952c-1d > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-column516_77952c-1d > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column516_77952c-1d{position:relative;}@media all and (max-width: 1024px){.kadence-column516_77952c-1d > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-column516_77952c-1d > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column516_77952c-1d\"><div class=\"kt-inside-inner-col\">\n<p class=\"wp-block-paragraph\"><strong>Related articles<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705<a href=\"https:\/\/rtlearner.com\/en\/lin-protocol\/\">1 Protocol Desciption<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705<a href=\"https:\/\/rtlearner.com\/en\/lin-schedule-table\/\">2 Schedule table Description<\/a><\/p>\n<\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Verification on testbench<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Register Read\/Write<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The IP is controlled by setting internal registers. These registers are read\/written via bus access. I designed the interface based on the APB bus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check if the default values \u200b\u200bof Register are read correctly<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Whether the values \u200b\u200bare written and read properly in the register<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You need to check. This is the most basic testcase that every IP must go through.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Data transfer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Next, I need to verify that data transmission and reception are working properly. I connected two controllers using a Bus Functional Model (BFM) and conducted a test.<\/p>\n\n\n<style>.kb-image516_4d37eb-11.kb-image-is-ratio-size, .kb-image516_4d37eb-11 .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_4d37eb-11.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_4d37eb-11 .kb-image-is-ratio-size{align-self:unset;}.kb-image516_4d37eb-11 figure{max-width:650px;}.kb-image516_4d37eb-11 .image-is-svg, .kb-image516_4d37eb-11 .image-is-svg img{width:100%;}.kb-image516_4d37eb-11 .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_4d37eb-11 img.kb-img, .kb-image516_4d37eb-11 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_4d37eb-11.kb-image-is-ratio-size, .kb-image516_4d37eb-11 .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_4d37eb-11 figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_4d37eb-11\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/6ZrKf\/btsBqsT0cqf\/oBdKTyur1pzkPb5j7lajvk\/img.png\" alt=\"Test block diagram\" class=\"kb-img\"\/><figcaption>Test block diagram<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">I'll explain what BFM is later. Simply put, you can think of it as the core that controls the module. I verified that the Master TX and Master RX are functioning properly.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Sleep, wakeup<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This controller has sleep and wakeup functions that other IPs don't have, and I've verified that these functions work properly.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Error case<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Finally, I created a case where an error occurred artificially to verify that the LIN controller could detect the anomaly. The error case I created is as follows:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Master\/Slave mode<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bit error<\/li>\n\n\n\n<li>Checksum error<\/li>\n\n\n\n<li>Timeout error<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Slave mode only<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Break error<\/li>\n\n\n\n<li>Sync error<\/li>\n\n\n\n<li>Parity error<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Well then, shall we take a closer look at each one?<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Bit error<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The byte field of this protocol is 10 bits in total: 1 start bit + 8 data bits + 1 stop bit (excluding the break field).<\/p>\n\n\n<style>.kb-image516_88745c-43.kb-image-is-ratio-size, .kb-image516_88745c-43 .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_88745c-43.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_88745c-43 .kb-image-is-ratio-size{align-self:unset;}.kb-image516_88745c-43 figure{max-width:650px;}.kb-image516_88745c-43 .image-is-svg, .kb-image516_88745c-43 .image-is-svg img{width:100%;}.kb-image516_88745c-43 .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_88745c-43 img.kb-img, .kb-image516_88745c-43 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_88745c-43.kb-image-is-ratio-size, .kb-image516_88745c-43 .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_88745c-43 figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_88745c-43\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/csOr2Q\/btsBrMywrlq\/3plvbQFbQf8a4jyN4sr55k\/img.png\" alt=\"LIN Byte field\" class=\"kb-img\"\/><figcaption>Byte field<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The start bit is always low, and the stop bit is always high, so if this isn't the case, an error occurs. We artificially create an error by setting the start bit high or the stop bit low, and test whether the controller detects this.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Checksum error<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Both Master tx\/rx perform a checksum check at the end. If the checksum calculation result is incorrect, a checksum error occurs.<\/p>\n\n\n<style>.kb-image516_516de6-ad.kb-image-is-ratio-size, .kb-image516_516de6-ad .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_516de6-ad.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_516de6-ad .kb-image-is-ratio-size{align-self:unset;}.kb-image516_516de6-ad figure{max-width:650px;}.kb-image516_516de6-ad .image-is-svg, .kb-image516_516de6-ad .image-is-svg img{width:100%;}.kb-image516_516de6-ad .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_516de6-ad img.kb-img, .kb-image516_516de6-ad .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_516de6-ad.kb-image-is-ratio-size, .kb-image516_516de6-ad .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_516de6-ad figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_516de6-ad\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/dLy2Nr\/btsIN6iyRi2\/Z4vkBHTQVHsKrTSBeDXaJk\/img.png\" alt=\"Checksum of the frame\" class=\"kb-img\"\/><figcaption>Checksum of the frame<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Try artificially inputting different checksum values \u200b\u200bto see if the controller detects them (Enhanced checksum, classical checksum).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Timeout error<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Each byte field has something called inter-byte space. I looked through the spec, but it wasn't clearly defined. So, when I was designing the LIN controller, the condition for transitioning from the stop bit of the previous byte field to the start bit of the next byte field was when the LIN bus went from high to low. (I don't know the inter-byte space time between byte fields.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">However, if for some reason there is no signal coming from the bus, the LIN slave module will malfunction. <strong>This should never happen.<\/strong>Therefore, if there is no signal coming in for a certain period of time during communication, a timeout error is detected and an interrupt is generated so that the module can be initialized.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Break error (slave only)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">As mentioned earlier, excluding the break field, the LIN slave will receive a high signal for at least 10 bits due to the stop bit. Only in the break field will it receive a low signal for more than 13 bits.<\/p>\n\n\n<style>.kb-image516_b83d6d-b3.kb-image-is-ratio-size, .kb-image516_b83d6d-b3 .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_b83d6d-b3.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_b83d6d-b3 .kb-image-is-ratio-size{align-self:unset;}.kb-image516_b83d6d-b3 figure{max-width:650px;}.kb-image516_b83d6d-b3 .image-is-svg, .kb-image516_b83d6d-b3 .image-is-svg img{width:100%;}.kb-image516_b83d6d-b3 .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_b83d6d-b3 img.kb-img, .kb-image516_b83d6d-b3 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_b83d6d-b3.kb-image-is-ratio-size, .kb-image516_b83d6d-b3 .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_b83d6d-b3 figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_b83d6d-b3\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/qJVKn\/btsINTDOsm9\/9U1iUKJDO1JdOeKXerEBdK\/img.png\" alt=\"Break field\" class=\"kb-img\"\/><figcaption>Break field<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">But what happens if the slave recognizes the break field and receives a high signal within 13 bits? <strong>This could indicate either that the slave's communication speed doesn't match the master's<\/strong>,or that <strong>the slave intervened in the communication for some reason.<\/strong>(Since it's hardware, there could be external factors like shock, right?)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Whether it's the first or second situation, there's a problem, so we designed the slave controller to detect the error.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Sync error (slave only)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">In the Sync field, the slave always receives a value of 0x55. If the value does not match, an error occurs because the communication speed between the master and slave does not match.<\/p>\n\n\n<style>.kb-image516_c40ea4-7f.kb-image-is-ratio-size, .kb-image516_c40ea4-7f .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_c40ea4-7f.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_c40ea4-7f .kb-image-is-ratio-size{align-self:unset;}.kb-image516_c40ea4-7f figure{max-width:650px;}.kb-image516_c40ea4-7f .image-is-svg, .kb-image516_c40ea4-7f .image-is-svg img{width:100%;}.kb-image516_c40ea4-7f .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_c40ea4-7f img.kb-img, .kb-image516_c40ea4-7f .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_c40ea4-7f.kb-image-is-ratio-size, .kb-image516_c40ea4-7f .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_c40ea4-7f figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_c40ea4-7f\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/beQl3O\/btsIOC2r3uo\/X9tIUxsahqIc6ru46y10d1\/img.png\" alt=\"Sync field\" class=\"kb-img\"\/><figcaption>Sync field<\/figcaption><\/figure><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Parity error (slave only)<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">As a final error case, we designed the PID to detect parity errors.<\/p>\n\n\n<style>.kb-image516_7918b9-4f.kb-image-is-ratio-size, .kb-image516_7918b9-4f .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_7918b9-4f.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_7918b9-4f .kb-image-is-ratio-size{align-self:unset;}.kb-image516_7918b9-4f figure{max-width:650px;}.kb-image516_7918b9-4f .image-is-svg, .kb-image516_7918b9-4f .image-is-svg img{width:100%;}.kb-image516_7918b9-4f .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_7918b9-4f img.kb-img, .kb-image516_7918b9-4f .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_7918b9-4f.kb-image-is-ratio-size, .kb-image516_7918b9-4f .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_7918b9-4f figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_7918b9-4f\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/4eLON\/btsBr3z85NZ\/HnNmISGKSEUHtOysVbkKC1\/img.png\" alt=\"PID field\" class=\"kb-img\"\/><figcaption>PID field<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The slave controller calculates parity using the PID value received from the master controller. If the calculated parity differs from the received parity, an error occurs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FPGA test<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We mounted the designed controller on SoC (2 channels), performed FPGA synthesis, and conducted data communication tests.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Test without LIN transceiver<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">First, we tested by connecting the IO pins on the FPGA board without a transceiver. While this is a 1-wire communication, the transceiver we purchased has TX\/RX pins on the board, so we designed an output enable and assigned it to the board pins.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So, if we represent the test environment in a diagram, it would look like this:<\/p>\n\n\n<style>.kb-image516_c88705-64.kb-image-is-ratio-size, .kb-image516_c88705-64 .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_c88705-64.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_c88705-64 .kb-image-is-ratio-size{align-self:unset;}.kb-image516_c88705-64 figure{max-width:650px;}.kb-image516_c88705-64 .image-is-svg, .kb-image516_c88705-64 .image-is-svg img{width:100%;}.kb-image516_c88705-64 .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_c88705-64 img.kb-img, .kb-image516_c88705-64 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_c88705-64.kb-image-is-ratio-size, .kb-image516_c88705-64 .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_c88705-64 figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_c88705-64\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/uBok0\/btsC4DnnJQL\/KbRQaM4syMi5ltTN5UvqH0\/img.png\" alt=\"FPGA test diagram\" class=\"kb-img\"\/><figcaption>FPGA test diagram<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Of course I passed this test, but the next part was the problem;;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Test with LIN transceiver<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In actual communication, a transceiver is connected. The transceiver converts the digital signal from the FPGA into an analog signal. It also converts the board output voltage (1.8V or 3.3V) to the actual communication voltage of 9-18V. We used <a href=\"https:\/\/www.mikroe.com\/lin-click\" target=\"_blank\" rel=\"noopener\">MIKROE's LIN CLICK<\/a>product.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First, here is a picture of the test environment:<\/p>\n\n\n<style>.kb-image516_f879e8-ff.kb-image-is-ratio-size, .kb-image516_f879e8-ff .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_f879e8-ff.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_f879e8-ff .kb-image-is-ratio-size{align-self:unset;}.kb-image516_f879e8-ff figure{max-width:650px;}.kb-image516_f879e8-ff .image-is-svg, .kb-image516_f879e8-ff .image-is-svg img{width:100%;}.kb-image516_f879e8-ff .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_f879e8-ff img.kb-img, .kb-image516_f879e8-ff .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_f879e8-ff.kb-image-is-ratio-size, .kb-image516_f879e8-ff .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_f879e8-ff figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_f879e8-ff\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/cV6XH1\/btsDfWdN3gK\/syW7crq23qLaIbYKQvT4Yk\/img.png\" alt=\"FPGA test with transceiver diagram\" class=\"kb-img\"\/><figcaption>FPGA test with transceiver diagram<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Let me explain while looking at the actual transceiver.<\/p>\n\n\n<style>.kb-image516_88e5c4-05.kb-image-is-ratio-size, .kb-image516_88e5c4-05 .kb-image-is-ratio-size{max-width:500px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_88e5c4-05.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_88e5c4-05 .kb-image-is-ratio-size{align-self:unset;}.kb-image516_88e5c4-05 figure{max-width:500px;}.kb-image516_88e5c4-05 .image-is-svg, .kb-image516_88e5c4-05 .image-is-svg img{width:100%;}.kb-image516_88e5c4-05 .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_88e5c4-05 img.kb-img, .kb-image516_88e5c4-05 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_88e5c4-05.kb-image-is-ratio-size, .kb-image516_88e5c4-05 .kb-image-is-ratio-size{max-width:200px;width:100%;}.kb-image516_88e5c4-05 figure{max-width:200px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_88e5c4-05\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/bEX339\/btsC76vyNd6\/MMXbiZDeyo0McAIWesTye0\/img.png\" alt=\"LIN CLICK\" class=\"kb-img\"\/><figcaption>LIN CLICK<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">This transceiver doesn't support both Master and Slave modes at the same time, which was a bit disappointing. Slave mode is the default, but you have to solder it to change it to Master;;; You can also select the voltage you want to use in the same way, but I used 3.3V. And there's a power LED on the transceiver.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The LIN BUS connector is the part that actually sends and receives the 1-wire signal. The connection picture is as follows.<\/p>\n\n\n<style>.kb-image516_250888-21.kb-image-is-ratio-size, .kb-image516_250888-21 .kb-image-is-ratio-size{max-width:600px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_250888-21.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_250888-21 .kb-image-is-ratio-size{align-self:unset;}.kb-image516_250888-21 figure{max-width:600px;}.kb-image516_250888-21 .image-is-svg, .kb-image516_250888-21 .image-is-svg img{width:100%;}.kb-image516_250888-21 .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_250888-21 img.kb-img, .kb-image516_250888-21 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_250888-21.kb-image-is-ratio-size, .kb-image516_250888-21 .kb-image-is-ratio-size{max-width:200px;width:100%;}.kb-image516_250888-21 figure{max-width:200px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_250888-21\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/0AEl2\/btsC528frLu\/sydxr2k6jhkyltHjGCbz01\/img.png\" alt=\"LIN BUS Connector\" class=\"kb-img\"\/><figcaption>BUS Connector<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The port connected with the red line is LIN BUS and the part connected with the white line is VS, but I had a hard time because of VS;;; There are pins on the back of the transceiver that connect to the FPGA board.<\/p>\n\n\n<style>.kb-image516_3e8b76-91.kb-image-is-ratio-size, .kb-image516_3e8b76-91 .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_3e8b76-91.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_3e8b76-91 .kb-image-is-ratio-size{align-self:unset;}.kb-image516_3e8b76-91 figure{max-width:650px;}.kb-image516_3e8b76-91 .image-is-svg, .kb-image516_3e8b76-91 .image-is-svg img{width:100%;}.kb-image516_3e8b76-91 .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_3e8b76-91 img.kb-img, .kb-image516_3e8b76-91 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_3e8b76-91.kb-image-is-ratio-size, .kb-image516_3e8b76-91 .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_3e8b76-91 figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_3e8b76-91\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/Uogwb\/btsC8XLRh1z\/yz0sc7lPTBCGSMAKP2URfk\/img.png\" alt=\"Transceiver \ub4b7\uba74 \uc124\uba85\" class=\"kb-img\"\/><figcaption>Description of the back of the transceiver<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Among the transceiver pins, one of EN, 3.3V, GND, and TX\/RX pins are used. I thought I should also use the WK pin, but it didn't affect the actual test. I connected the 3.3V power supply to the EN and 3.3V pins, GND to GND, and TX\/RX to the FPGA. When Power and GND are connected, the LED lights up.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At first, there was no specific explanation for the VS pin on the LIN BUS Connector, so I tested it without using VS, but there was no signal. After looking into it, I found out that you need to input a reference voltage to the VS pin. So, the LIN BUS is inout and VS is input. The LIN BUS voltage is determined by the voltage input to VS. I used 10V.<\/p>\n\n\n<style>.kb-image516_c701ca-8f.kb-image-is-ratio-size, .kb-image516_c701ca-8f .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_c701ca-8f.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_c701ca-8f .kb-image-is-ratio-size{align-self:unset;}.kb-image516_c701ca-8f figure{max-width:650px;}.kb-image516_c701ca-8f .image-is-svg, .kb-image516_c701ca-8f .image-is-svg img{width:100%;}.kb-image516_c701ca-8f .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_c701ca-8f img.kb-img, .kb-image516_c701ca-8f .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_c701ca-8f.kb-image-is-ratio-size, .kb-image516_c701ca-8f .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_c701ca-8f figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_c701ca-8f\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/pbDwD\/btsDfj1tuWp\/vV3JbBQKtkIU0kNIMKaAfK\/img.png\" alt=\"\uc2e4\uc81c BUS \uc2e0\ud638, ref voltage: 10V\" class=\"kb-img\"\/><figcaption>Actual BUS signal, ref voltage: 10V<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">So the signal that goes through the transceiver and into the FPGA is:<\/p>\n\n\n<style>.kb-image516_a07a14-c6.kb-image-is-ratio-size, .kb-image516_a07a14-c6 .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_a07a14-c6.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_a07a14-c6 .kb-image-is-ratio-size{align-self:unset;}.kb-image516_a07a14-c6 figure{max-width:650px;}.kb-image516_a07a14-c6 .image-is-svg, .kb-image516_a07a14-c6 .image-is-svg img{width:100%;}.kb-image516_a07a14-c6 .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_a07a14-c6 img.kb-img, .kb-image516_a07a14-c6 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_a07a14-c6.kb-image-is-ratio-size, .kb-image516_a07a14-c6 .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_a07a14-c6 figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_a07a14-c6\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/dy4zLY\/btsDawtt6Xs\/EKMjURmn5M03vm2LAsD0fk\/img.png\" alt=\"FPGA input signal\" class=\"kb-img\"\/><figcaption>FPGA input signal<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">However, there is one thing to note. I thought the transceiver's TX\/RX only outputs and inputs, but the transceiver RX sends out the BUS signal as is. However, there is a delay between TX - BUS - RX, so problems may occur in the case of the RX from the Master's perspective.<\/p>\n\n\n<style>.kb-image516_0aa7f7-18.kb-image-is-ratio-size, .kb-image516_0aa7f7-18 .kb-image-is-ratio-size{max-width:600px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_0aa7f7-18.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_0aa7f7-18 .kb-image-is-ratio-size{align-self:unset;}.kb-image516_0aa7f7-18 figure{max-width:600px;}.kb-image516_0aa7f7-18 .image-is-svg, .kb-image516_0aa7f7-18 .image-is-svg img{width:100%;}.kb-image516_0aa7f7-18 .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_0aa7f7-18 img.kb-img, .kb-image516_0aa7f7-18 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_0aa7f7-18.kb-image-is-ratio-size, .kb-image516_0aa7f7-18 .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_0aa7f7-18 figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_0aa7f7-18\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/vgZQZ\/btsC7q1SHCd\/uNqSsngiYHYlwf1oNA6ZRk\/img.png\" alt=\"Delay \uc774\uc288\" class=\"kb-img\"\/><figcaption>Delay \uc774\uc288<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Because of this delay, I needed to fix the rtl,,,, The text became too long, so if you have any questions about the problem, please feel free to ask by email!!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Test with PLIN<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Setting up the verification environment<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Now, it's the final part of the IP verification. So far, I've been conducting data transfer tests by connecting the controllers I designed, but what about connecting them to other controllers? I used PEAK's PCAN USB PRO FD (hereafter, PLIN) for my tests.<\/p>\n\n\n<style>.kb-image516_679a5e-2f.kb-image-is-ratio-size, .kb-image516_679a5e-2f .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_679a5e-2f.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_679a5e-2f .kb-image-is-ratio-size{align-self:unset;}.kb-image516_679a5e-2f figure{max-width:650px;}.kb-image516_679a5e-2f .image-is-svg, .kb-image516_679a5e-2f .image-is-svg img{width:100%;}.kb-image516_679a5e-2f .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_679a5e-2f img.kb-img, .kb-image516_679a5e-2f .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_679a5e-2f.kb-image-is-ratio-size, .kb-image516_679a5e-2f .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_679a5e-2f figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_679a5e-2f\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/b0wJVP\/btsEGit6NEX\/LK1X3UG1Zqa9zmjklqWL71\/img.png\" alt=\"\uc88c: PLIN \/ \uc6b0: Test \ud658\uacbd\" class=\"kb-img\"\/><figcaption>Left: PLIN \/ Right: Test environment<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Even if you have PLIN, you still need a control program, right?? You can download the installation file from the <a href=\"https:\/\/www.peak-system.com\/PCAN-USB-Pro-FD.366.0.html?&amp;L=1\" target=\"_blank\" rel=\"noopener\">PEAK homepage<\/a>.<\/p>\n\n\n<style>.kb-image516_ca7502-f9.kb-image-is-ratio-size, .kb-image516_ca7502-f9 .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_ca7502-f9.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_ca7502-f9 .kb-image-is-ratio-size{align-self:unset;}.kb-image516_ca7502-f9 figure{max-width:650px;}.kb-image516_ca7502-f9 .image-is-svg, .kb-image516_ca7502-f9 .image-is-svg img{width:100%;}.kb-image516_ca7502-f9 .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_ca7502-f9 img.kb-img, .kb-image516_ca7502-f9 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_ca7502-f9.kb-image-is-ratio-size, .kb-image516_ca7502-f9 .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_ca7502-f9 figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_ca7502-f9\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/Uy0Gw\/btsEEZ29I5Z\/k1Kvh0LM78ehd7IoVFNLxk\/img.png\" alt=\"\ud504\ub85c\uadf8\ub7a8 \ub2e4\uc6b4\ub85c\ub4dc\" class=\"kb-img\"\/><figcaption>Download the program<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">When downloading and installing the file, you must set the LIN device driver option to use the control program.<\/p>\n\n\n<style>.kb-image516_b51343-61.kb-image-is-ratio-size, .kb-image516_b51343-61 .kb-image-is-ratio-size{max-width:500px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_b51343-61.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_b51343-61 .kb-image-is-ratio-size{align-self:unset;}.kb-image516_b51343-61 figure{max-width:500px;}.kb-image516_b51343-61 .image-is-svg, .kb-image516_b51343-61 .image-is-svg img{width:100%;}.kb-image516_b51343-61 .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_b51343-61 img.kb-img, .kb-image516_b51343-61 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_b51343-61.kb-image-is-ratio-size, .kb-image516_b51343-61 .kb-image-is-ratio-size{max-width:200px;width:100%;}.kb-image516_b51343-61 figure{max-width:200px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_b51343-61\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/bModyF\/btsEIN76n4o\/kbttJTpdQsgkWoMFjcSdu0\/img.png\" alt=\"\uc635\uc158 \uc124\uc815\" class=\"kb-img\"\/><figcaption>Set options<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">When you connect PLIN to your PC, the green light in <strong>the red box<\/strong>, as shown in the photo below, will blink. Confirm this blinking and run the installed program. Select the port to use, set master or slave, set the communication speed, and then click Connect. The green light in the blue box will blink. This completes the program's preparation.<\/p>\n\n\n<style>.kb-image516_b70a82-93.kb-image-is-ratio-size, .kb-image516_b70a82-93 .kb-image-is-ratio-size{max-width:600px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_b70a82-93.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_b70a82-93 .kb-image-is-ratio-size{align-self:unset;}.kb-image516_b70a82-93 figure{max-width:600px;}.kb-image516_b70a82-93 .image-is-svg, .kb-image516_b70a82-93 .image-is-svg img{width:100%;}.kb-image516_b70a82-93 .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_b70a82-93 img.kb-img, .kb-image516_b70a82-93 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_b70a82-93.kb-image-is-ratio-size, .kb-image516_b70a82-93 .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_b70a82-93 figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_b70a82-93\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/edCbMC\/btsEGjs1U5c\/XNB75mlWQ9a0EP1QXPiFNK\/img.png\" alt=\"\ud504\ub85c\uadf8\ub7a8 \uc2dc\uc791 \ud654\uba74\" class=\"kb-img\"\/><figcaption>Program start screen<\/figcaption><\/figure><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Communication after frame creation<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Once the connection is complete, you will see a window like the following. Here you can create a frame and start communication.<\/p>\n\n\n<style>.kb-image516_7d1baa-16.kb-image-is-ratio-size, .kb-image516_7d1baa-16 .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_7d1baa-16.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_7d1baa-16 .kb-image-is-ratio-size{align-self:unset;}.kb-image516_7d1baa-16 figure{max-width:650px;}.kb-image516_7d1baa-16 .image-is-svg, .kb-image516_7d1baa-16 .image-is-svg img{width:100%;}.kb-image516_7d1baa-16 .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_7d1baa-16 img.kb-img, .kb-image516_7d1baa-16 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_7d1baa-16.kb-image-is-ratio-size, .kb-image516_7d1baa-16 .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_7d1baa-16 figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_7d1baa-16\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/r76ML\/btsEKG1VxCn\/MH6ma0pTShGkSZxb3nO900\/img.png\" alt=\"New frame\uc744 \ub20c\ub7ec frame \uc0dd\uc131\" class=\"kb-img\"\/><figcaption>Click New frame to create a frame<\/figcaption><\/figure><\/div>\n\n\n<style>.kb-image516_8c5565-34.kb-image-is-ratio-size, .kb-image516_8c5565-34 .kb-image-is-ratio-size{max-width:500px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_8c5565-34.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_8c5565-34 .kb-image-is-ratio-size{align-self:unset;}.kb-image516_8c5565-34 figure{max-width:500px;}.kb-image516_8c5565-34 .image-is-svg, .kb-image516_8c5565-34 .image-is-svg img{width:100%;}.kb-image516_8c5565-34 .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_8c5565-34 img.kb-img, .kb-image516_8c5565-34 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_8c5565-34.kb-image-is-ratio-size, .kb-image516_8c5565-34 .kb-image-is-ratio-size{max-width:200px;width:100%;}.kb-image516_8c5565-34 figure{max-width:200px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_8c5565-34\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/diLZnD\/btsENRWjPvb\/m5YvklNWQNYkmgG8bcGN20\/img.png\" alt=\"Frame \uc124\uc815\" class=\"kb-img\"\/><figcaption>Frame setting<\/figcaption><\/figure><\/div>\n\n\n\n<h5 class=\"wp-block-heading\">Tx Frame<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">First, set the control program to master and set the PID to 0x20. Set both Classic and Enhanced checksum to Classic and set Direction to Publisher, indicating that the PLIN will send data. Length will automatically change based on the PID.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you set it like this, the data input part will be activated, set it to 0x33, 0x22, 0x11, 0xCA and complete the frame setting.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Rx Frame<\/h5>\n\n\n\n<p class=\"wp-block-paragraph\">When setting to Rx, set Direction to Subscriber. In this case, the data input section will be disabled.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After completing the frame settings, you can see that the frame has been created in the frame list as follows.<\/p>\n\n\n<style>.kb-image516_eca564-00.kb-image-is-ratio-size, .kb-image516_eca564-00 .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_eca564-00.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_eca564-00 .kb-image-is-ratio-size{align-self:unset;}.kb-image516_eca564-00 figure{max-width:650px;}.kb-image516_eca564-00 .image-is-svg, .kb-image516_eca564-00 .image-is-svg img{width:100%;}.kb-image516_eca564-00 .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_eca564-00 img.kb-img, .kb-image516_eca564-00 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_eca564-00.kb-image-is-ratio-size, .kb-image516_eca564-00 .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_eca564-00 figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_eca564-00\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/d9NDk5\/btsENTmixSY\/rNmVtSnFbSERB2qJBMbWZ1\/img.png\" alt=\"Frame \ubaa9\ub85d\" class=\"kb-img\"\/><figcaption>Frame List<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">After verifying the frame, connect the controller you want to test to the BUS. The port is RS232 format, and the pin mapping is as follows.<\/p>\n\n\n<style>.kb-image516_b64ff2-26.kb-image-is-ratio-size, .kb-image516_b64ff2-26 .kb-image-is-ratio-size{max-width:650px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_b64ff2-26.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_b64ff2-26 .kb-image-is-ratio-size{align-self:unset;}.kb-image516_b64ff2-26 figure{max-width:650px;}.kb-image516_b64ff2-26 .image-is-svg, .kb-image516_b64ff2-26 .image-is-svg img{width:100%;}.kb-image516_b64ff2-26 .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_b64ff2-26 img.kb-img, .kb-image516_b64ff2-26 .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_b64ff2-26.kb-image-is-ratio-size, .kb-image516_b64ff2-26 .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_b64ff2-26 figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_b64ff2-26\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/0TmVs\/btsENUyJJmQ\/wCoe2IZnZKC4KrTxxv5By1\/img.png\" alt=\"PLIN \ud3ec\ud2b8 pin \uc124\uba85\" class=\"kb-img\"\/><figcaption>Port pin description<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">For connection, you can use pins 4, 5, or 6, 9.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pin 4: BUS<\/li>\n\n\n\n<li>Pin 5 or 6: GND<\/li>\n\n\n\n<li>Pin&nbsp;9:&nbsp;Vref<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The Vref input to pin 9 should be the same voltage as the transceiver voltage of the controller you are testing, right?? Once you have prepared the test environment like this, select the frame you created earlier and press the spacebar to start communication. Then, the communication result will be displayed in the Receive section. The picture below is the communication result of the 0x21 \u2013 master rx frame.<\/p>\n\n\n<style>.kb-image516_c4e3fb-eb.kb-image-is-ratio-size, .kb-image516_c4e3fb-eb .kb-image-is-ratio-size{max-width:600px;width:100%;}.wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_c4e3fb-eb.kb-image-is-ratio-size, .wp-block-kadence-column > .kt-inside-inner-col > .kb-image516_c4e3fb-eb .kb-image-is-ratio-size{align-self:unset;}.kb-image516_c4e3fb-eb figure{max-width:600px;}.kb-image516_c4e3fb-eb .image-is-svg, .kb-image516_c4e3fb-eb .image-is-svg img{width:100%;}.kb-image516_c4e3fb-eb .kb-image-has-overlay:after{opacity:0.3;}.kb-image516_c4e3fb-eb img.kb-img, .kb-image516_c4e3fb-eb .kb-img img{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}@media all and (max-width: 767px){.kb-image516_c4e3fb-eb.kb-image-is-ratio-size, .kb-image516_c4e3fb-eb .kb-image-is-ratio-size{max-width:250px;width:100%;}.kb-image516_c4e3fb-eb figure{max-width:250px;}}<\/style>\n<div class=\"wp-block-kadence-image kb-image516_c4e3fb-eb\"><figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/blog.kakaocdn.net\/dn\/uMzbc\/btsEHIFQKGq\/Jv09McY8o6AH1KkVzf3wSk\/img.png\" alt=\"\ud1b5\uc2e0 \uacb0\uacfc\" class=\"kb-img\"\/><figcaption>Communication results<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">By performing PLIN tests like this, I was able to verify that the controller I designed complies with the protocol specification. This testing method certainly helped me find bugs that I hadn't discovered when testing my two controllers together.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There were several, one of which was the checksum calculation method. I had to add all the data and invert it at the very end, but I didn't do that;; I'm glad I found it.<\/p>\n\n\n<style>.kadence-column516_640b75-c1 > .kt-inside-inner-col{box-shadow:0px 0px 14px 0px rgba(0, 0, 0, 0.2);}.kadence-column516_640b75-c1 > .kt-inside-inner-col,.kadence-column516_640b75-c1 > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column516_640b75-c1 > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column516_640b75-c1 > .kt-inside-inner-col{flex-direction:column;}.kadence-column516_640b75-c1 > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-column516_640b75-c1 > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column516_640b75-c1{position:relative;}@media all and (max-width: 1024px){.kadence-column516_640b75-c1 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-column516_640b75-c1 > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column516_640b75-c1\"><div class=\"kt-inside-inner-col\">\n<p class=\"wp-block-paragraph\"><strong>Related articles<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705<a href=\"https:\/\/rtlearner.com\/en\/lin-protocol\/\">1 Protocol Desciption<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705<a href=\"https:\/\/rtlearner.com\/en\/lin-schedule-table\/\">2 Schedule table Description<\/a><\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">References: <a href=\"https:\/\/www.cs-group.de\/wp-content\/uploads\/2016\/11\/LIN_Specification_Package_2.2A.pdf\" target=\"_blank\" rel=\"noopener\">LIN specification<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>After months of work on the LIN controller IP RTL design,...<\/p>","protected":false},"author":1,"featured_media":527,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[2],"tags":[25,31],"class_list":["post-516","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-rtl-engineer","tag-bus","tag-lin"],"_links":{"self":[{"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/posts\/516","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/comments?post=516"}],"version-history":[{"count":9,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/posts\/516\/revisions"}],"predecessor-version":[{"id":535,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/posts\/516\/revisions\/535"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/media\/527"}],"wp:attachment":[{"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/media?parent=516"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/categories?post=516"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rtlearner.com\/en\/wp-json\/wp\/v2\/tags?post=516"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}<!-- This website is optimized by Airlift. Learn more: https://airlift.net. Template:. Learn more: https://airlift.net. Template: 6a588749d36f73a90a601ae0. Config Timestamp: 2026-07-16 07:24:54 UTC, Cached Timestamp: 2026-09-03 12:11:55 UTC, Optimization Time: 3.73ms -->