先 Enable SPI Kernel Module
ls /dev 會看到有
spidev0.0 及 spidev0.1
程式::
#include
<cstdlib>
#include
<stdio.h>
#include
<fcntl.h>
#include
<sys/ioctl.h>
#include
<linux/spi/spidev.h>
#include
<unistd.h>
#include
<string.h>
using namespace
std;
int spi_cs0_fd;
unsigned char
spi_mode;
unsigned char
spi_bitsPerWord;
unsigned int
spi_speed;
int
spiOpenPort()
{
    int *spi_cs_fd;
    int status_value=-1;
    spi_mode=SPI_MODE_0;
    spi_bitsPerWord=8;
    spi_speed=1000000;
    spi_cs_fd=&spi_cs0_fd;
   
*spi_cs_fd=open("/dev/spidev0.0",O_RDWR);
    if(*spi_cs_fd<0)
    {
        printf("Open /dev/spidev0.0
failed\r\n");
        exit(1);
    }
   
status_value=ioctl(*spi_cs_fd,SPI_IOC_WR_MODE,&spi_mode);
    if(status_value<0)
    {
        printf("W spi_mode
failed\r\n");
        exit(1);
    }
   
status_value=ioctl(*spi_cs_fd,SPI_IOC_RD_MODE,&spi_mode);
    if(status_value<0)
    {
        printf("RD spi_mode failed\r\n");
        exit(1);
    }
   
status_value=ioctl(*spi_cs_fd,SPI_IOC_WR_BITS_PER_WORD,&spi_bitsPerWord);
    if(status_value<0)
    {
        printf("WR sp_bitsPerWord
failed\r\n");
        exit(1);
    }
    status_value=ioctl(*spi_cs_fd,SPI_IOC_RD_BITS_PER_WORD,&spi_bitsPerWord);
    if(status_value<0)
    {
        printf("RD sp_bitsPerWord
failed\r\n");
        exit(1);
    }
   
status_value=ioctl(*spi_cs_fd,SPI_IOC_WR_MAX_SPEED_HZ,&spi_speed);
    if(status_value<0)
    {
        printf("WR spi_spped
failed\r\n");
        exit(1);
    }
   
status_value=ioctl(*spi_cs_fd,SPI_IOC_RD_MAX_SPEED_HZ,&spi_speed);
    if(status_value<0)
    {
        printf("RD spi_spped
failed\r\n");
        exit(1);
    }
    return(status_value);    
}
int
SpiWriteAndRead(unsigned char *data,int length)
{
    struct spi_ioc_transfer spi[length];
    int i=0;
    int retVal =-1;
    int *spi_cs_fd;
    spi_cs_fd=&spi_cs0_fd;
    for(i=0;i<length;i++)
    {
        memset(&spi[i],0,sizeof(spi[i]));
        spi[i].tx_buf=(unsigned long)(data+i);
        spi[i].rx_buf=(unsigned long)(data+i);
        spi[i].len=sizeof(*(data+i));
        spi[i].delay_usecs=0;
        spi[i].speed_hz=spi_speed;
        spi[i].bits_per_word=spi_bitsPerWord;
        spi[i].cs_change=0;
    }
   
retVal=ioctl(*spi_cs_fd,SPI_IOC_MESSAGE(length),&spi);
    if(retVal<0)
    {
        printf("tran error \n\r");
        exit(1);
    }
    return retVal;   
}
int main(int
argc, char** argv) {
    unsigned char buffer[100];
    for(int j=0;j<100;j++)buffer[j]=0x55;
    if(spiOpenPort()<0)
    {
        return -1;
    }
    SpiWriteAndRead(buffer,100);
    close(spi_cs0_fd);
    return 0;
}
 參考資料:
Using the SPI Interface
C
library for Broadcom BCM 2835 as used in Raspberry Pi
Interfacing an
SPI ADC(MCP3008) chip to Raspberry Pi using C++(spidev)
沒有留言:
張貼留言