Skip to content

SPI fails on RPI 3 model B #128

@gacobj

Description

@gacobj

Board Type

RaspberryPi3

Operating System

Raspbian Buster

Swift Version

swift-5.1.5

Description

SPI send call fails with "Message too long" error.

This appears to fix this issue.

struct spi_ioc_transfer {
//var tx_buf: UnsafeMutableRawPointer
//var rx_buf: UnsafeMutableRawPointer
var tx_buf: UInt64
var rx_buf: UInt64
var len: UInt32
var speed_hz: UInt32 = 500000
var delay_usecs: UInt16 = 0
var bits_per_word: UInt8 = 8
let cs_change: UInt8 = 0
let tx_nbits: UInt8 = 0
let rx_nbits: UInt8 = 0
let pad: UInt16 = 0
}

And in transferData function

var r: CInt = 0

    r = tx.withUnsafeMutableBufferPointer { (txPtr: inout UnsafeMutableBufferPointer<UInt8>) -> CInt in
        if let txPtr1 = UnsafeMutableRawPointer(txPtr.baseAddress) {
            return rx.withUnsafeMutableBufferPointer { (rxPtr : inout UnsafeMutableBufferPointer<UInt8>) -> CInt in
                if let rxPtr1 = UnsafeMutableRawPointer(rxPtr.baseAddress) {
                    var tr = spi_ioc_transfer(
                        //tx_buf: txPtr.baseAddress!,
                        tx_buf: UInt64(UInt(bitPattern: txPtr1)),
                        //rx_buf: rxPtr.baseAddress!,
                        rx_buf: UInt64(UInt(bitPattern: rxPtr1)),
                        len: UInt32(txPtr.count),
                        speed_hz: speed,
                        delay_usecs: delay,
                        bits_per_word: bits)
                    return ioctl(fd, SPI_IOC_MESSAGE1, &tr)
                }
                return 0
            }
        }
        return 0
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions