Autor Tema: ADC por SPI  (Leído 430 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Holgorio

  • PIC12
  • **
  • Mensajes: 51
ADC por SPI
« en: 05 de Febrero de 2019, 13:46:33 »
Buenas.

Un amigo me ha dejado una placa con un modulo, que hizo para su proyecto de fin de carrera, le hable que estaba aprendiendo (o intentandolo) y me la ha dado por que ya no le sirve para nada según él.

El caso es que estaba intentando hacerla funcionar pero no estoy siendo capaz. El micro es un ARM cortex M4 de synergy, el micro ya lo manejo mas o menos, los timer, entradas salidas, etc.
pero estoy intentando comunicarme con el ADC por spi, el adc es un AD7124 de analog devices.
El cual tiene una librería para usarlo que se puede encontrar aquí:

https://wiki.analog.com/resources/tools-software/uc-drivers/ad7124

ya he añadido los ficheros del driver:

ad7124_regs.c
ad7124_regs.h
ad7124_regs.c
ad7124.c
ad7124.h

A esto no hay que hacerle ninguna modificación por lo que entiendo, pero ahora viene lo difícil que es el dichero platform_driver, que es para comunicar por SPI y lo tienes que modificar dependiendo del micro (creo)
Aquí es donde me he perdido un poco, ya he configurado el SPI en mi micro, pero no se plasmarlo ahora para que esto cuadre.

ademas hay algunos fallos en la documentación y en la libreria, por ejemplo, la estructura llamada en la documentación "ad7124_device" en realidad en la librería creo que es "ad7124_dev"

Alguien puede enseñarme a modificar el "platform_driver.c", es genérico a mi solo me interesa la parte del SPI, con que consiga leer un registro o algo me conformo con eso ya puedo ir tirando del hilo he ir avanzando.

un saludo y gracias.

Código: [Seleccionar]
/******************************************************************************/
/***************************** Include Files **********************************/
/******************************************************************************/
#include <stdint.h>
#include "platform_drivers.h"

/******************************************************************************/
/************************ Functions Definitions *******************************/
/******************************************************************************/

/**
 * @brief Initialize the I2C communication peripheral.
 * @param desc - The I2C descriptor.
 * @param init_param - The structure that contains the I2C parameters.
 * @return SUCCESS in case of success, FAILURE otherwise.
 */
int32_t i2c_init(struct i2c_desc **desc,
const struct i2c_init_param *param)
{
if (desc) {
// Unused variable - fix compiler warning
}

if (param->type) {
// Unused variable - fix compiler warning
}

return SUCCESS;
}

/**
 * @brief Free the resources allocated by i2c_init().
 * @param desc - The I2C descriptor.
 * @return SUCCESS in case of success, FAILURE otherwise.
 */
int32_t i2c_remove(struct i2c_desc *desc)
{
if (desc) {
// Unused variable - fix compiler warning
}

return SUCCESS;
}

/**
 * @brief Write data to a slave device.
 * @param desc - The I2C descriptor.
 * @param data - Buffer that stores the transmission data.
 * @param bytes_number - Number of bytes to write.
 * @param stop_bit - Stop condition control.
 *                   Example: 0 - A stop condition will not be generated;
 *                            1 - A stop condition will be generated.
 * @return SUCCESS in case of success, FAILURE otherwise.
 */
int32_t i2c_write(struct i2c_desc *desc,
  uint8_t *data,
  uint8_t bytes_number,
  uint8_t stop_bit)
{
if (desc) {
// Unused variable - fix compiler warning
}

if (data) {
// Unused variable - fix compiler warning
}

if (bytes_number) {
// Unused variable - fix compiler warning
}

if (stop_bit) {
// Unused variable - fix compiler warning
}

return SUCCESS;
}

/**
 * @brief Read data from a slave device.
 * @param desc - The I2C descriptor.
 * @param data - Buffer that will store the received data.
 * @param bytes_number - Number of bytes to read.
 * @param stop_bit - Stop condition control.
 *                   Example: 0 - A stop condition will not be generated;
 *                            1 - A stop condition will be generated.
 * @return SUCCESS in case of success, FAILURE otherwise.
 */
int32_t i2c_read(struct i2c_desc *desc,
uint8_t *data,
uint8_t bytes_number,
uint8_t stop_bit)
{
if (desc) {
// Unused variable - fix compiler warning
}

if (data) {
// Unused variable - fix compiler warning
}

if (bytes_number) {
// Unused variable - fix compiler warning
}

if (stop_bit) {
// Unused variable - fix compiler warning
}

return SUCCESS;
}

/**
 * @brief Initialize the SPI communication peripheral.
 * @param desc - The SPI descriptor.
 * @param init_param - The structure that contains the SPI parameters.
 * @return SUCCESS in case of success, FAILURE otherwise.
 */
int32_t spi_init(struct spi_desc **desc,
const struct spi_init_param *param)
{
if (desc) {
// Unused variable - fix compiler warning
}

if (param->type) {
// Unused variable - fix compiler warning
}

return SUCCESS;
}

/**
 * @brief Free the resources allocated by spi_init().
 * @param desc - The SPI descriptor.
 * @return SUCCESS in case of success, FAILURE otherwise.
 */
int32_t spi_remove(struct spi_desc *desc)
{
if (desc) {
// Unused variable - fix compiler warning
}

return SUCCESS;
}

/**
 * @brief Write and read data to/from SPI.
 * @param desc - The SPI descriptor.
 * @param data - The buffer with the transmitted/received data.
 * @param bytes_number - Number of bytes to write/read.
 * @return SUCCESS in case of success, FAILURE otherwise.
 */
int32_t spi_write_and_read(struct spi_desc *desc,
   uint8_t *data,
   uint8_t bytes_number)
{
if (desc) {
// Unused variable - fix compiler warning
}

if (data) {
// Unused variable - fix compiler warning
}

if (bytes_number) {
// Unused variable - fix compiler warning
}

return 0;
}

/**
 * @brief Obtain the GPIO decriptor.
 * @param desc - The GPIO descriptor.
 * @param gpio_number - The number of the GPIO.
 * @return SUCCESS in case of success, FAILURE otherwise.
 */
int32_t gpio_get(struct gpio_desc **desc,
uint8_t gpio_number)
{
if (desc) {
// Unused variable - fix compiler warning
}

if (gpio_number) {
// Unused variable - fix compiler warning
}

return 0;
}

/**
 * @brief Free the resources allocated by gpio_get().
 * @param desc - The SPI descriptor.
 * @return SUCCESS in case of success, FAILURE otherwise.
 */
int32_t gpio_remove(struct gpio_desc *desc)
{
if (desc) {
// Unused variable - fix compiler warning
}

return SUCCESS;
}

/**
 * @brief Enable the input direction of the specified GPIO.
 * @param desc - The GPIO descriptor.
 * @return SUCCESS in case of success, FAILURE otherwise.
 */
int32_t gpio_direction_input(struct gpio_desc *desc)
{
if (desc) {
// Unused variable - fix compiler warning
}

return 0;
}

/**
 * @brief Enable the output direction of the specified GPIO.
 * @param desc - The GPIO descriptor.
 * @param value - The value.
 *                Example: GPIO_HIGH
 *                         GPIO_LOW
 * @return SUCCESS in case of success, FAILURE otherwise.
 */
int32_t gpio_direction_output(struct gpio_desc *desc,
      uint8_t value)
{
if (desc) {
// Unused variable - fix compiler warning
}

if (value) {
// Unused variable - fix compiler warning
}

return 0;
}

/**
 * @brief Get the direction of the specified GPIO.
 * @param desc - The GPIO descriptor.
 * @param direction - The direction.
 *                    Example: GPIO_OUT
 *                             GPIO_IN
 * @return SUCCESS in case of success, FAILURE otherwise.
 */
int32_t gpio_get_direction(struct gpio_desc *desc,
   uint8_t *direction)
{
if (desc) {
// Unused variable - fix compiler warning
}

if (direction) {
// Unused variable - fix compiler warning
}

return 0;
}

/**
 * @brief Set the value of the specified GPIO.
 * @param desc - The GPIO descriptor.
 * @param value - The value.
 *                Example: GPIO_HIGH
 *                         GPIO_LOW
 * @return SUCCESS in case of success, FAILURE otherwise.
 */
int32_t gpio_set_value(struct gpio_desc *desc,
       uint8_t value)
{
if (desc) {
// Unused variable - fix compiler warning
}

if (value) {
// Unused variable - fix compiler warning
}

return 0;
}

/**
 * @brief Get the value of the specified GPIO.
 * @param desc - The GPIO descriptor.
 * @param value - The value.
 *                Example: GPIO_HIGH
 *                         GPIO_LOW
 * @return SUCCESS in case of success, FAILURE otherwise.
 */
int32_t gpio_get_value(struct gpio_desc *desc,
       uint8_t *value)
{
if (desc) {
// Unused variable - fix compiler warning
}

if (value) {
// Unused variable - fix compiler warning
}

return 0;
}

/**
 * @brief Generate miliseconds delay.
 * @param msecs - Delay in miliseconds.
 * @return None.
 */
void mdelay(uint32_t msecs)
{
if (msecs) {
// Unused variable - fix compiler warning
}
}

Desconectado Holgorio

  • PIC12
  • **
  • Mensajes: 51
Re:ADC por SPI
« Respuesta #1 en: 06 de Febrero de 2019, 09:18:01 »
Bueno al final he decidido pasar de la libreria esa y hacermela yo mismo.

Comunico perfectamente con el ADC externo, ya que he comprobado que grabo un registro y luego al leerlo tiene ese valor.

El problema es que siempre me da el valor 0, creo que no empieza a medir nunca, y no se exactamente como hacerlo.

He configurado el canal 0 para que las entradas sean AIN4 la entrada positiva y AVSS la negativa, pero al leer el registro del dato siempre esta a 0.

en la configuración inicial he metido estos comandos:

ADC CONTROL REGISTER 0x0000
CHANNEL REGISTER 0x8011
CONFIGURATION REGISTERS 0x0018

https://www.analog.com/media/en/technical-documentation/data-sheets/AD7124-4.pdf

en la entrada tengo una divisor resistivo conectado el la tira de pines pero siempre que leo el registro "DATA" esta a 0 y creo que es por que no se iniciar la conversión.

un saludo.