This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AFE4300:是否可以验证微控制器是否烧坏了?

Guru**** 2524980 points
Other Parts Discussed in Thread: AFE4300

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1010629/afe4300-is-it-possible-to-verify-if-the-microcontroller-burned-out

器件型号:AFE4300

您好!

我正在 AFE4300上进行生物阻抗测量、因此我正在使用 Raspberry Pi 4。

我当前遇到的问题与寄存器的读取有关。 我将向您发送我编写的 python 代码。

import spidev #bibliotheque SPI (protocole de communication entre le Raspebrry et l'AFE)
import wiringpi
import RPi.GPIO as GPIO

# Adresses des registres de l'AFE4300 (Cf. datasheet AFE: Register Map)

ADC_DATA_RESULT = 0x00
ADC_CONTROL_REGISTER1 = 0x01
MISC_REGISTER1 = 0x02
MISC_REGISTER2 = 0x03
DEVICE_CONTROL1 = 0x09
ISW_MUX = 0x0A
VSENSE_MUX = 0x0B
IQ_MODE_ENABLE = 0x0C
WEIGHT_SCALE_CONTROL = 0x0D
BCM_DAC_FREQ = 0x0E
DEVICE_CONTROL2 = 0x0F
ADC_CONTROL_REGISTER2 = 0x10
MISC_REGISTER3 = 0x1A

# Definition des pins

wiringpi.wiringPiSetupPhys() # La numerotation des broches du Raspberry est la numerotation physique

# Pin CLK

wiringpi.pinMode(12,2) # broche 12 en PWM (le signal d'horloge)

wiringpi.pwmSetMode(0) # 0: frequence constante
wiringpi.pwmSetRange(10)
wiringpi.pwmSetClock(2) # la frequence est donne par f = 19.2 MHz / (pwmClock x pwmRange), on veut une freq de 1 MHz

wiringpi.pwmWrite(12,5) # rapport cyclique par rapport au Range (10) => 5 equivaut a un rapport cyclique (duty cycle) 50 %

# Pin RESET

wiringpi.pinMode(11,1) # broche 11 en sortie
wiringpi.digitalWrite(11,0) # broche 11 etat bas, ce qui correspond a effectuer un reset (obligatoire) de l'AFE

wiringpi.delay(5) # on doit laisser au moins 5ms le pin RESET a l'etat bas

wiringpi.digitalWrite(11,0) # on met le pin RESET a l'etat haut pour commencer l'utilisation de l'AFE

wiringpi.delay(5)

# Pin RDY

wiringpi.pinMode(13,0) # broche 13 en entree


# Activer le bus SPI pour la communication Raspberry <-> AFE
    
spi = spidev.SpiDev() #nouvel objet SPI (AFE)
spi.open(0,0) # sur le port SPI0 et CS (Chip Select) = 0 (correspond au pin 24, GPIO 8)
spi.max_speed_hz = 1000000 # frequence d'horloge en Hz, f = 1 MHz (Cf. datasheet AFE)
spi.mode = 0b01 #mode 1 du SPI i.e. polarite = 0, phase = 1 => mode 1 (Cf. datasheet AFE, spi timing)

## FONCTIONS  -----------------------------------------------------------

# Protocole des donnees vers les registres de l'AFE (Cf. pages 17-19 datasheet AFE):

    # Le paquet de bits a envoyer est compose de 24 bits (donc 3 octets): 
    # Le premier octet correspond a l'adresse du registre sollicite
    # Les deux octets suivants contiennent les valeurs a transmettre sur le registre 

def writeRegister(adress,data): # adress: adresse du registre dans lequel on souhaite ecrire
                                # data: donnees a transmettre dans le registre
    adress = adress & 0x1F
    
    firstByte = data >> 8 # premier octet des data
    secondByte = data & 0xFF# deuxieme octet des data
    
    spi.writebytes([adress, firstByte, secondByte])
    
# Lecture des donnees renvoyees par les registres de l'AFE (Cf. pages 17-19 datasheet AFE)

def readRegister(adress,data):
    
    adress = adress & 0x1F # derniers 5 bits de l'adresse
    adress = adress | 0x20 # permet d'etre en mode lecture (le bit 21 doit valoir 1)
    
    firstByte = data >> 8
    secondByte = data & 0xFF
    
    a=spi.xfer2([adress, firstByte, secondByte])
    print("adresse: ")
    print(a)
    print("\n")

def readData(frequence):
    
    
    # 1) Envoyer signal a une frequence donnee
    
    writeRegister(BCM_DAC_FREQ,frequence) # preparer le registre BCM_DAC_FREQ pour une mesure a une freq donnee
    wiringpi.delay(5)
    
    # 2) Mode lecture de ADC_RESULT
    
    readRegister(ADC_DATA_RESULT,0x00)

def setupAFE():
    
    # Initialisation AFE

    writeRegister(ADC_CONTROL_REGISTER1,0x5140)
    writeRegister(MISC_REGISTER1,0x0000)
    writeRegister(MISC_REGISTER2,0xFFFF)
    writeRegister(DEVICE_CONTROL1,0x6004)
    writeRegister(ISW_MUX,0x0000)
    writeRegister(VSENSE_MUX,0x0000)
    writeRegister(IQ_MODE_ENABLE,0x0000)
    writeRegister(WEIGHT_SCALE_CONTROL,0x0000)
    writeRegister(BCM_DAC_FREQ,0x0040)
    writeRegister(DEVICE_CONTROL2,0x0000)
    writeRegister(ADC_CONTROL_REGISTER2,0x0011)
    writeRegister(MISC_REGISTER3,0x0030)

    wiringpi.delay(5)

    # Initialisation des registres de BodyComposition

    writeRegister(ADC_CONTROL_REGISTER1,0x4140)
    writeRegister(MISC_REGISTER1,0x0000)
    writeRegister(MISC_REGISTER2,0xFFFF)
    writeRegister(DEVICE_CONTROL1,0x6004)
    writeRegister(ISW_MUX,0x0408)
    writeRegister(VSENSE_MUX,0x0804)
    writeRegister(IQ_MODE_ENABLE,0x0000)
    writeRegister(WEIGHT_SCALE_CONTROL,0x0000)
    writeRegister(BCM_DAC_FREQ,0x0040)
    writeRegister(DEVICE_CONTROL2,0x0000)
    writeRegister(ADC_CONTROL_REGISTER2,0x0063)
    writeRegister(MISC_REGISTER3,0x0030)

# Fin de la communication AFE/Raspberry

def endCommunication():
    spi.close()

## FONCTION PRINCIPALE -----------------------------------------------------------------------

# # Apres le reset, les registres de l'AFE sont dans leur etat par defaut, il faut donc les mettre dans leur config initiale

setupAFE()

# Lecture registres

readRegister(ADC_CONTROL_REGISTER1,0x4140)
readRegister(MISC_REGISTER1,0x0000)
readRegister(MISC_REGISTER2,0xFFFF)
readRegister(DEVICE_CONTROL1,0x6004)
readRegister(ISW_MUX,0x0408)
readRegister(VSENSE_MUX,0x0804)
readRegister(IQ_MODE_ENABLE,0x0000)
readRegister(WEIGHT_SCALE_CONTROL,0x0000)
readRegister(BCM_DAC_FREQ,0x0040)
readRegister(DEVICE_CONTROL2,0x0000)
readRegister(ADC_CONTROL_REGISTER2,0x0063)
readRegister(MISC_REGISTER3,0x0030)

# Lecture impedance

F = [0x0032, 0x0064] # liste des frequences des courants envoyes (50 kHz, 100 kHz)

for f in F:
    readData(f)

endCommunication()

我将复制此代码中最有趣的行(写入和读取寄存器)。

def writeRegister(adress,data): # adress: adresse du registre dans lequel on souhaite ecrire
                                # data: donnees a transmettre dans le registre
    adress = adress & 0x1F
    
    firstByte = data >> 8 # premier octet des data
    secondByte = data & 0xFF# deuxieme octet des data
    
    spi.writebytes([adress, firstByte, secondByte])
    
# Lecture des donnees renvoyees par les registres de l'AFE (Cf. pages 17-19 datasheet AFE)

def readRegister(adress,data):
    
    adress = adress & 0x1F # derniers 5 bits de l'adresse
    adress = adress | 0x20 # permet d'etre en mode lecture (le bit 21 doit valoir 1)
    
    firstByte = data >> 8
    secondByte = data & 0xFF
    
    a=spi.xfer2([adress, firstByte, secondByte])
    print("adresse: ")
    print(a)
    print("\n")

def readData(frequence):
    
    
    # 1) Envoyer signal a une frequence donnee
    
    writeRegister(BCM_DAC_FREQ,frequence) # preparer le registre BCM_DAC_FREQ pour une mesure a une freq donnee
    wiringpi.delay(5)
    
    # 2) Mode lecture de ADC_RESULT
    
    readRegister(ADC_DATA_RESULT,0x00)

您能否检查此代码中是否存在错误?


如果正确、AFE 可能被烧毁、在本例中、您是否有程序和电路来检查此假设?

此致。

Maxime

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Maxime:

    遗憾的是、我们无法查看您的代码是否正确。

    您可能需要首先检查 SPI 写入是否正常。 您可以通过检查 VREF 电压来验证这一点。

    要验证 VREF 电压(假设器件超出复位范围)、在上电和复位后、只需写入 DEVICE_CONTROL1寄存器地址(0x09)值0x6006。

     

    检查 SPI 时序图、并查看时序沿是否符合数据表说明。

    例如、该器件在 SCLK 的下降沿锁存 SDIN 上的数据。 在读取期间、数据在 SCLK 的上升沿的 SDOUT 引脚上移出。 另请注意、每次读取寄存器时、除非读取数据输出寄存器、否则必须重写寄存器。