/* * SPI.cpp * * Created on: 2014/06/06 * Author: sunaga */ #include #include #include #include #include #include #include #include "SPI.h" int SPI::InitDevie(int devNo, int mode, int speed, int bits) { int ret; m_nSpeed = speed; m_nBits = bits; m_nMode = mode; m_nDeviceNo = devNo; if(devNo == 0) { m_nFd = open("/dev/spidev0.0", O_RDWR); } else { m_nFd = open("/dev/spidev0.1", O_RDWR); } if (m_nFd < 0) { return -1; } ret = ioctl(m_nFd, SPI_IOC_WR_MODE, &m_nMode); if(ret < 0) { return -1; } ret = ioctl(m_nFd, SPI_IOC_RD_MODE, &m_nMode); if(ret < 0) { return -1; } ret = ioctl(m_nFd, SPI_IOC_RD_BITS_PER_WORD, &m_nBits); if(ret < 0) { return -1; } ret = ioctl(m_nFd, SPI_IOC_WR_MAX_SPEED_HZ, &m_nSpeed); if(ret < 0) { return -1; } ret = ioctl(m_nFd, SPI_IOC_RD_MAX_SPEED_HZ, &m_nSpeed); if(ret < 0) { return -1; } return 0; } SPI::~SPI() { if (m_nFd >= 0) { close(m_nFd); return; } } int SPI::WriteOnly(int len, unsigned char* lpOut) { int i, ret; const int maxSendData = 2048; struct spi_ioc_transfer spi ; memset(&spi, 0, sizeof(spi_ioc_transfer)); if(len <= maxSendData) { spi.tx_buf = (unsigned long)lpOut; spi.rx_buf = NULL; spi.len = len ; spi.delay_usecs = 0 ; spi.speed_hz = m_nSpeed; spi.bits_per_word = m_nBits ; spi.cs_change = 0; ret = ioctl (m_nFd, SPI_IOC_MESSAGE(1), &spi) ; } else { int quotient = len / maxSendData; int remainder = len % maxSendData; for(i = 0; i < quotient; i++) { spi.tx_buf = (unsigned long)lpOut; spi.rx_buf = NULL; spi.len = maxSendData; spi.delay_usecs = 0 ; spi.speed_hz = m_nSpeed; spi.bits_per_word = m_nBits ; spi.cs_change = 0; ret = ioctl (m_nFd, SPI_IOC_MESSAGE(1), &spi) ; if(ret < 0) { return -1; } lpOut += maxSendData; } if(remainder != 0) { spi.tx_buf = (unsigned long)lpOut; spi.rx_buf = NULL; spi.len = remainder ; spi.delay_usecs = 0 ; spi.speed_hz = m_nSpeed; spi.bits_per_word = m_nBits ; ret = ioctl (m_nFd, SPI_IOC_MESSAGE(1), &spi) ; } } return ret; } int SPI::WriteRead(int len, char* lpOut, char* lpIn) { struct spi_ioc_transfer spi ; memset(&spi, 0, sizeof(spi_ioc_transfer)); spi.tx_buf = (unsigned long)lpOut; spi.rx_buf = (unsigned long)lpIn; spi.len = len ; spi.delay_usecs = 0 ; spi.speed_hz = m_nSpeed; spi.bits_per_word = m_nBits ; spi.pad = 0 ; return ioctl (m_nFd, SPI_IOC_MESSAGE(1), &spi) ; }