import Data.Word(Word8,Word16) import Data.Bits((.|.),(.&.),shiftL,shiftR) import Foreign.Marshal.Array(withArrayLen,peekArray) import Control.Monad(forM_) import Control.Concurrent(threadDelay) import System.PIO(binToNum) import System.PIO.Linux(fdOpen,IOMode(ReadWriteMode),fdClose) import System.PIO.Linux.SPI.Raw {-- Connection for Intel Edison $ sh/setup_spi.sh 5 1 109 114 115 111 [J17-10] == SS [J17-11] == SCLK [J17-12] == MOSI [J18-11] == MISO [J19- 2] == VDD [J19- 3] == GND --} bin :: String -> Word8 bin = binToNum demoSetting :: IO () demoSetting = do fd <- fdOpen "/dev/spidev5.1" ReadWriteMode print . fromEnum =<< getMode fd setMode fd Mode1 print . fromEnum =<< getMode fd setMode fd Mode2 print . fromEnum =<< getMode fd setMode fd Mode3 print . fromEnum =<< getMode fd setMode fd Mode0 print . fromEnum =<< getMode fd print =<< getLsbFirst fd -- setLsbFirst fd True -- print =<< getLsbFirst fd setLsbFirst fd False print =<< getLsbFirst fd print =<< getBitsPerWord fd setBitsPerWord fd 7 print =<< getBitsPerWord fd setBitsPerWord fd 8 print =<< getBitsPerWord fd setBitsPerWord fd 10 print =<< getBitsPerWord fd setBitsPerWord fd 20 print =<< getBitsPerWord fd print =<< getMaxSpeedHz fd setMaxSpeedHz fd 7000 print =<< getMaxSpeedHz fd setMaxSpeedHz fd 8000 print =<< getMaxSpeedHz fd setMaxSpeedHz fd 9100 print =<< getMaxSpeedHz fd setMaxSpeedHz fd 1000000 print =<< getMaxSpeedHz fd fdClose fd demoTransferTxRx1 :: IO () demoTransferTxRx1 = do let bits = 8 let speed = 1000000 let ch = 0 fd <- fdOpen "/dev/spidev5.1" ReadWriteMode setMode fd Mode0 setBitsPerWord fd bits setMaxSpeedHz fd speed forM_ [0..99] $ \_ -> do let dt0 = bin "1100000" .|. (ch `shiftL` 4) let dt1 = 0 dt0':dt1':_ <- withArrayLen [dt0,dt1] $ \len p -> transferTxRx1 fd p len bits speed 0 False >> peekArray len p let v = ((fromIntegral (dt0' .&. bin "11") :: Word16) `shiftL` 8) .|. (fromIntegral dt1' :: Word16) print v threadDelay $ 500 * 1000 fdClose fd dt0'' ch = bin "00000110" .|. ( (bin "0100" .&. ch) `shiftR` 2) dt1'' ch = bin "00000000" .|. ( (bin "0011" .&. ch) `shiftL` 6)