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);
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