Перейти к содержанию
    

0men

Свой
  • Постов

    142
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

Сообщения, опубликованные 0men


  1. ставлю точку останова на UserToPMABufferCopy - вижу ptrBuffer = 10 Send_length = 2 - все верно. и на терминале вижу - 10. без точки останова - на терминал не приходит ничего.

     

    Значит надо копать внутрь этих функций.

  2. M24M02-DRMN6

     

    I2C_HandleTypeDef	I2cHandle;
    
    void I2C_init( void )
    {
    I2cHandle.Instance			 = I2C3;
    
    I2cHandle.Init.AddressingMode  = I2C_ADDRESSINGMODE_7BIT;
    I2cHandle.Init.ClockSpeed	  = 400000;
    I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED;
    I2cHandle.Init.DutyCycle	   = I2C_DUTYCYCLE_16_9;
    I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED;
    I2cHandle.Init.NoStretchMode   = I2C_NOSTRETCH_DISABLED;
    I2cHandle.Init.OwnAddress1	 = 0xa0;
    //	I2cHandle.Init.OwnAddress2	 = 0xFE;
    
    __I2C3_CLK_ENABLE();
    
    /* I2C SCL GPIO pin configuration  */
    GPIO_InitTypeDef  GPIO_InitStruct;
    GPIO_InitStruct.Pin	   = GPIO_PIN_8;
    GPIO_InitStruct.Mode	  = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull	  = GPIO_PULLUP;
    GPIO_InitStruct.Speed	 = GPIO_SPEED_FAST;
    GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    /* I2C SDA GPIO pin configuration  */
    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
    
    HAL_I2C_Init(&I2cHandle);
    }
    
    unsigned char EEPROM_write_byte
    (
    uint32_t		adr,
    uint8_t			data
    )
    {
    uint8_t			i2c_adr = 0xa0;
    
    // set slave address for write
    if ((adr&0x10000) != 0)
    	i2c_adr = 0xa2;
    if ((adr&0x20000) != 0)
    	i2c_adr |= 0x04;
    
    while(HAL_I2C_Mem_Write(&I2cHandle, (uint16_t)i2c_adr, uint16_t(adr&0xffff), 2, &data, 1, 1000)!= HAL_OK);
    
    return( 0 );
    }
    
    unsigned char EEPROM_write_page
    (
    uint32_t		adr,
    uint8_t *		refdata
    )
    {
    uint8_t			i2c_adr = 0xa0;
    
    // set slave address for write
    if ((adr&0x10000) != 0)
    	i2c_adr = 0xa2;
    if ((adr&0x20000) != 0)
    	i2c_adr |= 0x04;
    
    while(HAL_I2C_Mem_Write(&I2cHandle, (uint16_t)i2c_adr, uint16_t(adr&0xffff), 2, refdata, 256, 1000) != HAL_OK);
    
    HAL_Delay( 6 );
    
    return( 0 );
    }
    
    unsigned char EEPROM_read_byte
    (
    uint32_t		adr,
    uint8_t *		refdata
    )
    {
    uint8_t			i2c_adr = 0xa1;
    
    // set slave address for read
    if ((adr&0x10000) != 0)
    	i2c_adr = 0xa3;
    if ((adr&0x20000) != 0)
    	i2c_adr |= 0x04;
    
    while(HAL_I2C_Mem_Read(&I2cHandle, (uint16_t)i2c_adr, uint16_t(adr&0xffff), 2, refdata, 1, 1000)!= HAL_OK);
    
    return( 0 );
    
    }

  3. Я бы посмотрел, как Вы "HAL stm-овский проект, который активно развивается и его вылизывают на сотнях, тысячах проектов..." на самолетный блок поставили бы, и если ни дай бог оно откажет или вывалится в HardFault... Тенденция лепить говно везде, я смотрю, очевидно набирает обороты.

    В общем, с Вами мне все понятно, обсуждать тут и нечего. Всего Вам наилучшего :laughing:

     

    Не везде требуется самолетная надежность. Я вот использую HAL, максимальный уровень оптимизации, сотни проборов, годы эксплуатации, сбоев нет. Все зависит от задачи и от кривизны рук.

  4. Здравствуйте, у меня тут ребус :wacko:

    HAL_I2C_Master_Receive возвращает HAL_BUSY

    ....................................................................

     

    так вы залезьте внутрь HAL_I2C_Master_Receive и посмотрите причину HAL_BUSY. Там не так много вариантов

     

  5. Только сейчас дошло, что на самом деле, у меня такая картина: буферы A1,2,3 активно читаются одновременно другими задачами. То есть все 8 буферов пишутся одной задачей, а вот дальше идет асинхронное чтение из них разными задачами, причем активно используются именно три буфера, показывающие минимальную скорость общения.

    Сейчас с кэшем поиграюсь....

     

    Upd: А как мне кэш выключить? И вообще что там есть кэш при конкретно доступе к SDRAM? Кроме как "Burst read" ничего не вижу.

     

    Возможно, когда буферы пишутся, контроллер сдрам пишет их, используя бурст, это самый быстрый доступ. При асинхронном чтении (записи) все значительно медленнее.

  6. Да, имеется ввиду Repeated START Condition.

    Только HAL_I2C_Master_Transmit кроме старта и отправки данных генерит STOP в конце). А он протоколом не предусмотрен

     

     

    Впрочем, сейчас выясняется, что в документации на ds2482 не указано, что СТОП не мешает. Просто красавцы!

     

    Вот вот ))) на самом деле, много где указано в протоколе, что требуется Repeated START, но на моем опыте всегда работает STOP с новым стартом

  7. Если бы пару байт.....

    Я тут с анализатором сижу, башка уже кипит..... :wacko:

    У этой ds2482 протокол идиотский (нужны повторные стартовые посылки во время передачи), а не просто послать или принять байт (с этим я бы я сюда не писал :biggrin: )

    Вопрос в том, как этого добиться от стандартного драйвера

     

    под повторными вы подразумеваете Repeated START Condition?

     

    // Write both Design Capacity bytes starting at 0x4A

    data[1] = 0x46;

    data[2] = 0x11;

    while(HAL_I2C_Master_Transmit(&I2cHandle, (uint16_t)0xaa, &data[1], 2, 100)!= HAL_OK);

    data[1] = 0x47;

    data[2] = 0x30;

    while(HAL_I2C_Master_Transmit(&I2cHandle, (uint16_t)0xaa, &data[1], 2, 100)!= HAL_OK);

     

    исправлено: Repeated здесь не будет, но скажите страницу в доке где он так необходим? Строку с Repeated можно разбить на 2 отдельные посылки

  8. В первой серии даже встроенного pull-up нет. Но, тем не менее, повторюсь не в первый раз - для точного и быстрого определения отключения шнурка - VBUS.

     

    USB_OTG_GOTGINT_SEDET как раз и работает с VBUS

     

    Bit 2 SEDET: Session end detected

    The core sets this bit to indicate that the level of the voltage on VBUS is no longer valid for a

    B-Peripheral session when VBUS < 0.8 V

  9. Да. Но VBUS должен быть подключен, иначе Вы постоянно будете висеть в этом прерывании.

    И как решить вопрос с МК, у которых нет OTG? Например STM32F103? ...Хотя ТС озвучил F4xx серию, тем не менее, пускай вопрос будет риторический.

     

    там, видимо, как то иначе, не работал с первой серией

  10. Куб уже научился и провода подпаивать? :biggrin:

     

    у него все уже подпаяно, если внимательно почитать.

     

    куб определяет при вхождении в прерывание OTG_FS_IRQHandler через флаг USB_OTG_GOTGINT_SEDET

  11. Ок!

    Раньше были светодиоды, но как только опытные образцы заработали стабильно от них отказались.

     

    впаяйте в рабочую и нерабочую платы, посмотрите..

     

    попробуйте купить несколько процессоров другой ревизии, в элитане есть С

     

    Что еще можно попробовать, но это уже сродни танцу с бубном:

     

    в LowLevelInit исправить AT91C_MC_FWS_1FWS на AT91C_MC_FWS_2FWS

×
×
  • Создать...