使用 ATmega16A 的 MAX5402 数字电位器的 SPI 配置
SPI Configuration for a MAX5402 Digital potentiometer using an ATmega16A
//*----------------------------------
//*
//* 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, [=10=] ; 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。无论我向它发送什么值,输出都不会改变。
我已经三次检查了所有的物理连接,所以问题一定出在代码中;但我不知道出了什么问题。
非常感谢任何帮助,谢谢!
MAX5402_SPI_write
例程看起来很奇怪。你为什么要通过 SPI 发送这么多位?
根据数据 sheet,设备似乎期望:notCS 低,SPI 上一个字节,然后再次 notCS 高。您在中间步骤中通过 SPI 发送了许多字节。这会破坏数据,并且设备将默认为中间值,如您所见。
//*----------------------------------
//*
//* 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, [=10=] ; 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。无论我向它发送什么值,输出都不会改变。
我已经三次检查了所有的物理连接,所以问题一定出在代码中;但我不知道出了什么问题。 非常感谢任何帮助,谢谢!
MAX5402_SPI_write
例程看起来很奇怪。你为什么要通过 SPI 发送这么多位?
根据数据 sheet,设备似乎期望:notCS 低,SPI 上一个字节,然后再次 notCS 高。您在中间步骤中通过 SPI 发送了许多字节。这会破坏数据,并且设备将默认为中间值,如您所见。