Pages

Monday, November 19, 2012

MPS – Exercise 8 – LDD SPI


Formål

Formålet med denne øvelse er at lave en device driver til D/A converteren som sidder på Add-on boardet. Typen er en DAC7612 fra TI (Burr-Brown). På et embedded board finder man ofte enheder med SPI interface, såsom A/D converter, SD-kort, EPROM, Serial Flash mm. Når vi skal tilgå disse enheder fra en device driver skal vi benytte Linux’s SPI sub-system. SPI host’en er en del af processoren og processor leverandøren vil typisk levere denne, således at vi kan koncentere os om at lave SPI device driveren, til den enhed som vi tilslutter. For at gøre tingene lidt nemmere, får I udleveret source koden til A/D konverteren på boardet, I kan benytte denne som skabelon for jeres D/A konverter driver.

Øvelsen

a) Byg en spændingsdeler

Vi har valgt en modstand på 5100 ohm og en på 7500 ohm. Hvilket giver volt mellem 30-50% af 5V.

b) Test spændingsdeler via ADC

Herunder har vi beregnet på de to modstander bygget som en spændingsdeler. Vi får en output på 2,024 V.

Beregning: 





Når vi forbinder spændingsdeleren til  5V, GND og ADC og driveren loades aflæses følgende på terminalen:





2,047 V

c) Implementer init

Sådan er DAC forbundet til OMAP:
















SPI karakteristika:
Det kan ses udefra schematics at SPI skal være følgende: 

  • SPI Mode: Mode 3 
  • SPI max speed: 20 MHz
  • Bits per access: 8-bit per access

Værdier indsættes i board struct’en:
Fil: ads7870-core.c
static struct omap2_mcspi_device_config dac7612_mcspi_config = {
  .turbo_mode          = 0,
  .single_channel  = 1/* 0: slave, 1: master */
};

struct spi_board_info omap3devkit8000_spi_board_info[] = {
  {
    .modalias      = "dac7612",
    .bus_num       = 1,
    .chip_select   = 3,
    .max_speed_hz  = 15000000,
    .controller_data  = &dac7612_mcspi_config,
    .mode               = SPI_MODE_3, // Clock polarity
  },

};

Printk er indsat og vi får følgende output:






d) Sæt en default værdi

Vi indsætter en værdi på 2000 mV i init:
Fil: ads7870-core.c

ads7870_spi_write_reg8(*ads7870_spi_device, 1, 2000);

Vi indsætter en værdi på 1000 mV i exit:
Fil: ads7870-core.c
ads7870_spi_write_reg8(spi, 1, 1000);

Vi aflæst vha. en multimeter på benet. Når vi initialisere driveren får vi følgende:
1,8 V
Når vi fjerner modulet får vi 0,5V.

e) Implementer write

Vi tilføjer write funktionens prototype i headerfilen: ads7870-core.h. Prototypen ses herunder:
int dac7612_write(u16, u16);

I ads7870-core.c implementerer vi vores write funktion:

int dac7612_write(u16 value, u16 minor)
{
    int err;
   
    err = ads7870_spi_write_reg8( ads7870_spi_device, minor, value);
   
    return err;
}

I filen: ads7870-spi.c under funktionen void ads7870_spi_write_reg8 tilføjes følgende kodelinje:

spi_write(m.spi, data, 2);

Write funktionen kaldes i ads7870.c.

Output på terminal:



No comments:

Post a Comment