Advertisement
Guest User

Untitled

a guest
Feb 27th, 2020
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.78 KB | None | 0 0
  1.  
  2.  
  3. typedef struct {
  4.     uint16_t config;
  5.     spi_transaction_t *trans;
  6.     gpio_config_t *gpio_conf;
  7.     spi_device_handle_t *spidev;
  8.     spi_device_interface_config_t *ifcfg;
  9.     spi_bus_config_t *buscfg;
  10. } ads1118_handle_t;
  11.  
  12. void ads1118_setup(spi_device_handle_t *spidev, spi_bus_config_t *buscfg, spi_device_interface_config_t *ifcfg, ads1118_handle_t *ads_dev){
  13.    
  14.     //ads1118_handle_t ads_dev;
  15.    
  16.     ads_dev->spidev = spidev;
  17.     ads_dev->ifcfg = ifcfg;
  18.     ads_dev->buscfg = buscfg;
  19.     ads_dev->trans->length = 16; // In bits. Use 16 for
  20.     ads_dev->trans->flags = SPI_TRANS_USE_TXDATA | SPI_TRANS_USE_RXDATA;
  21.     ads_dev->trans->user = (void*)1;
  22.     ads_dev->trans->cmd = 0; // 16 bit Command data, length < command_bits in ifcfg
  23.     ads_dev->trans->addr = 0; // 64 bit Address data, len < address_bits in ifcfg
  24.     ads_dev->trans->rxlength = 0; // Defaults to value of length
  25.     ads_dev->trans->user=(void*)1; // Pointer to some user-defined transaction ID
  26.     //ads1118_spi_trans.tx_data[0] = 0xFF; // Only used if SPI_TRANS_USE_TXDATA is set in .flags, otherwise uses tx_buffer
  27.     //ads1118_spi_trans.tx_data[1] = 0x00; // Only used if SPI_TRANS_USE_TXDATA is set in .flags, otherwise uses tx_buffer
  28.     //ads1118_spi_trans.rx_data  = ;// Presumably you'd never set this here as it's for receiving. Used if appropriate flag is set.
  29.     // Also consider *tx_buffer and *rx_buffer which you'll probably not set here
  30.    
  31.     ads_dev->gpio_conf->intr_type = GPIO_PIN_INTR_DISABLE;
  32.     ads_dev->gpio_conf->mode = GPIO_MODE_OUTPUT;
  33.     ads_dev->gpio_conf->pin_bit_mask = 1ULL<<ifcfg->spics_io_num; // FIXME: Generalise
  34.     ads_dev->gpio_conf->pull_down_en = 0;
  35.     ads_dev->gpio_conf->pull_up_en = 0;
  36.    
  37.     ads_dev->config = 0x058B; // Default settings per datasheet
  38.     ads_dev->trans->tx_data[0] = ads_dev->config >> 8;
  39.     ads_dev->trans->tx_data[1] = ads_dev->config & 0xFF;
  40.    
  41.     //return ads_dev;
  42.  
  43. }
  44.  
  45. void ads1118_read(ads1118_handle_t *ads_dev){
  46.  
  47.     esp_err_t ret;
  48.     ads_dev->trans->tx_data[0] |= (1<<7); // Sets bit 15 in the 16 bit value in tx_data, single shot
  49.     ret = spi_device_transmit(ads_dev->spidev, ads_dev->trans); // FIXME: Go async
  50.     assert( ret == ESP_OK );
  51.     ret = spi_bus_remove_device(ads_dev.spidev);
  52.     assert( ret == ESP_OK );
  53.     ret = gpio_config(&ads_dev.gpio_conf);
  54.     assert( ret == ESP_OK );
  55.     gpio_set_level(ads_dev.ifcfg.spics_io_num,0); // Assert CS. Don't deassert, because readding the SPI device later will do that
  56.     assert( ret == ESP_OK );
  57.     while(gpio_get_level(ads_dev.buscfg.sclk_io_num) != 0){
  58.         // FIXME: Essential: Some sort of way out if it never happens
  59.         vTaskDelay(1/portTICK_PERIOD_MS);
  60.     }
  61.     ret=spi_bus_add_device(HSPI_HOST, &ads_dev.ifcfg, &ads_dev.spidev);
  62.     assert( ret == ESP_OK );
  63.     int16_t y = ads_dev.trans.rx_data[1] + ads_dev.trans.rx_data[0]*256;
  64.     printf("Read: %d\r\n", y);
  65.    
  66. }
  67.  
  68. void app_main()
  69. {
  70.    
  71.     // SPI
  72.     // miso, mosi, clock, cs = 16, 17, 18, 19
  73.    
  74.     spi_device_handle_t spi;
  75.     esp_err_t ret;
  76.     spi_bus_config_t buscfg={
  77.         .miso_io_num=16,
  78.         .mosi_io_num=17,
  79.         .sclk_io_num=18,
  80.         //.flags // Abilities of bus to be checked by the driver. Or-ed value of SPICOMMON_BUSFLAG_* flags.
  81.         //.max_transfer_sz, // In bytes, default 4096 if 0.
  82.         //.quadwp_io_num=-1, // Write Protect signal for 4 bit modes, or -1
  83.         //.quadhd_io_num=-1, // HoID signal for 4 bit modes, or -1
  84.         //.max_transfer_sz=PARALLEL_LINES*320*2+8
  85.         //.intr_flags // Interrupt flag for the bus to set the priority, and IRAM attribute, see docs
  86.     };
  87.    
  88.     spi_device_interface_config_t ifcfg={
  89.         .clock_speed_hz=1000000,           //Clock out at 1MHz
  90.         .mode=1,                                //SPI mode 1 for ADS1118; clock idles low and goes low mid-bit
  91.         .spics_io_num=19,               //CS pin
  92.         .queue_size=1,                          // max number of queue_trans() without get_trans_result()
  93.         //.pre_cb=spi_dummy_callback,  //Specify pre-transfer callback. Callback should be in RAM. (Cache miss?)
  94.         //.post_cb // Post-transfer callback. Again, IRAM.
  95.         //.command_bits=0,
  96.         //.address_bits=0,
  97.         //.dummy_bits=0,
  98.         .cs_ena_pretrans=1, // CS becomes active 0-16 bits before transmission. ADS1118 seems to need 1 clock.
  99.         //.cs_ena_posttrans=0, // CS stays active 0-16 bits after transmission
  100.         //.duty_cycle_pos=0, // Clock duty cycle in 1/256.. 128 = 0 = default.
  101.         //.input_delay_ns // Offset clock skew. Effectively sets data valid time on stuff we receive.
  102.     };
  103.    
  104.     ret=spi_bus_initialize(HSPI_HOST, &buscfg, 1); // Last arg is dma channel. NB, ISR runs on core that called this.
  105.     assert( ret == ESP_OK );
  106.     ret=spi_bus_add_device(HSPI_HOST, &ifcfg, &spi);
  107.     assert( ret == ESP_OK );
  108.     ads1118_handle_t ads_dev;
  109.     ads1118_setup(&spi, &buscfg, &ifcfg, &ads_dev);
  110.  
  111.     while(1) {
  112.  
  113.         ads1118_read(&ads_dev);
  114.         vTaskDelay(100/portTICK_PERIOD_MS);
  115.  
  116.     }
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement