使用 ATmega16A 的 MAX5402 数字电位器的 SPI 配置

Posted

技术标签:

【中文标题】使用 ATmega16A 的 MAX5402 数字电位器的 SPI 配置【英文标题】:SPI Configuration for a MAX5402 Digital potentiometer using an ATmega16A 【发布时间】:2016-12-03 17:16:36 【问题描述】:
    //*----------------------------------
    //*
    //* PROGRAM NAME:
    //* MAX5402_test.asm
    //*
    //* AUTHOR(S):
    //* Wilmer
    //*
    //* Version:
    //* 1.0
    //*
    //* Last Updated:
    //* 12/01/2016
    //*
    //* Target:
    //* ATmega16A
    //*
    //* DESCRIPTION:
    //* This program tests the
    //* MAX5402 Digital POT. using
    //* subroutines MAX5402_SPI_init,
    //* to initialize the ATmega16A's
    //* hardware for SPI, and
    //* subroutine MAX5402_SPI_write
    //* to write an 8-bit value to the
    //* Digital POT to set the position
    //* of the wiper.
    //*
    //* PORTS:
    //*
    //* PORTA:
    //* Not Used.
    //*
    //* PORTB:
    //* PIN5 = MOSI OUPUT
    //* PIN7 = SCK OUTPUT
    //*
    //* PORTC:
    //* J-Tag Pins
    //* PIN0 = CHIP SELECT OUTPUT
    //*
    //* PORTD:
    //* Not Used.
    //*
    //* Version History:
    //* 1.0 Original Version
    //*
    //*----------------------------------

    start:
    //--------Port Configuration--------//
        sbi DDRC, 0 ; Port C, Pin0 as
                     ; output for chip
                     ; select

        ldi r16, $BF ; PORTB as output
        out DDRB, r16; and MISO as Input 

    //----------Initilize Stack----------//
    ldi r16, LOW(RAMEND)
    out SPL, r16
    ldi r16, HIGH(RAMEND)
    out SPH, r16

    //Initialize SPI//
    call MAX5402_SPI_init

    main_loop:
    //Write to the MAX5402//
        ldi r16, $AB
        call MAX5402_SPI_write

        rjmp main_loop

    //*-------------------------------------
    //*
    //* SUBROUTINE NAME:
    //* MAX5402_SPI_init
    //*
    //* AUTHOR(S):
    //* Wilmer
    //*
    //* MODIFIES:
    //* SPCR (SPI Control Register)
    //*
    //* DESCRITION:
    //* Initialize SPI hardware to
    //* communicate with the MAX5402
    //*
    //*-------------------------------------

    MAX5402_SPI_init:
        push r16 ; conserve

    //---Configuring SPI Control Register---//
        ;SPI Interrupt disabled
        ;SPI enabled
        ;MSB transmitted first
        ;Master Selected
        ;Clock Phase & Polarity = 0
        ;SCK Frequency = fosc/128

        ldi r16, (0 << SPIE) | (1 << SPE) | (0 << DORD) | (1 << MSTR) | 
        (0 << CPOL) | (0 << CPHA) | (1 << SPR1) | (1 << SPR0)
        out SPCR,r16 

    //-------Clear SPI Interrupt Flag-------//
        in r16, SPSR
        in r16, SPDR

        pop r16 ; restore
        ret

    //*--------------------------------
    //*
    //* SUBROUTINE NAME:
    //* MAX5402_SPI_write
    //*
    //* AUTHOR(S):
    //* Wilmer
    //*
    //* MODIFIES:
    //* R16
    //*
    //* DESCRITION:
    //* Writes 8-bit value in r16.
    //* This value is used to set the
    //* wiper position of the MAX5402.
    //*
    //*--------------------------------

    MAX5402_SPI_write:
        push r17 ; conserve
        push r18
        push r19

        ldi r19, $FF ; Max Value

        ldi r17, $00    ; select MAX5402
        out PINC, r17

    //----------Send Data to Slave----------//
    send_data:
        out SPDR, r16 ; send data to the
                      ; SPI Data Register

    //-----Wait for Data to be Transfered-----//
    wait:
        sbis SPSR, SPIF
        rjmp wait

        inc r16     ; cpmare r16 to max value
        cpse r16, r19 ; if equal, stop sending data
        rjmp send_data  ; and repeat

        ldi r17, 1    ; de-select MAX5402

        out PINC, R16

        pop r19
        pop r18
        pop r17 ; restore
        ret

您好,我正在使用 ATmega16A 为 MAX5402 数字电位器编写此程序(测试仪)。对于这个程序,MAX5402 的 H 端设置为 +5V,L 端接地,以创建一个简单的分压器,其输出位于 W 端(参考数据表:https://datasheets.maximintegrated.com/en/ds/MAX5402.pdf)。

我需要做的是编写一个子程序,为 MAX5402 初始化 MCU 的 SPI 硬件,以及另一个使用 r16 (0x00 --> 0xFF) 向其发送 8 位值的子程序。该 8 位值用于设置 MAX5402 的抽头位置。

我的问题是,当使用 ATMEL STUDIO 7.0 进行仿真时,雨刮器仅输出 2.5V。无论我发送什么值,输出都不会改变。

我已经对所有物理连接进行了三次检查,因此问题必须出在代码中;但我无法弄清楚出了什么问题。 非常感谢任何帮助,谢谢!

【问题讨论】:

【参考方案1】:

MAX5402_SPI_write 例程看起来很奇怪。为什么要通过 SPI 发送这么多位?

从数据表来看,该器件预期:notCS 低,SPI 上一个字节,然后 notCS 再次高。您在中间步骤中通过 SPI 发送许多字节。如您所见,这将损坏数据,并且设备将默认为中间值。

【讨论】:

我不明白。我正在向 MAX5402 发送一个字节的数据,使用:send_data: out SPDR, r16 然后,等待数据传输完毕,然后再向锅发送另一个字节。 啊!请忽略我最后的评论。我刚刚阅读了您在数据表中所指的内容。在发送另一个数据字节之前,我必须先设置 /CS!谢谢你的帮助!

以上是关于使用 ATmega16A 的 MAX5402 数字电位器的 SPI 配置的主要内容,如果未能解决你的问题,请参考以下文章

Atmega8 上的时钟

hdu 5402 Travelling Salesman Problem

使用 macOS Sierra GM (16A322) 和 xCode 8.0 提交 iOS 应用程序以供审核时出错

Arduino Uno微控制器采用的是Atmel的ATmega328

CodeForces 16A Flag

CF16A Flag