Jump to content

    

jenya7

Участник
  • Content Count

    2070
  • Joined

  • Last visited

Community Reputation

0 Обычный

About jenya7

  • Rank
    Гуру

Recent Profile Visitors

5162 profile views
  1. можно конечно и так rx_fifo_size <= rx_fifo_full & rx_fifo_usedw; я бы даже сказал - нужно так :), раз корка выделила MSB бит в качестае флага full.
  2. но количество сообщений в ФИФО я читаю из usedw. а если usedw : out std_logic_vector (5 DOWNTO 0) он мне не выдаст 64. почему (5 DOWNTO 0) ? то есть мне надо изменить алгоритм чтения ФИФО? вместо if (size == 0) { if (status_rx_fifo & RX_FIFO_FULL_MASK) { //dummy read to resolve fifo_full = 1 issue SPI_can_rd(rd_opcode, 0, g_buff_in, 14); } return 0; } else { while (size > 0) { mailbox_save_to_struct(mcp_num, 0); size--; } } сделать if (size == 0) { if (status_rx_fifo & RX_FIFO_FULL_MASK) { //dummy read to resolve fifo_full = 1 issue SPI_can_rd(rd_opcode, 0, g_buff_in, 14); } return 0; } else { //to fix usedw 6 bit if (status_rx_fifo & RX_FIFO_FULL_MASK) size = 64; while (size > 0) { mailbox_save_to_struct(num, 0); size--; } }
  3. почему 6 бит не понял.
  4. ааа. блин. я понял. а почему кор генерирует 6 бит?
  5. минуточку! 0х3F - это 63 - начинаем то с нуля 0-63 - 64 сообщения зайдут в ФИФО.
  6. а что он должен сгенерировать? Размер ФИФО 64 - это 6 бит. что не так?
  7. настройки такие scfifo_component : scfifo GENERIC MAP ( add_ram_output_register => "ON", almost_empty_value => 1, almost_full_value => 62, intended_device_family => "MAX 10", lpm_numwords => 64, lpm_showahead => "ON", lpm_type => "scfifo", lpm_width => 104, lpm_widthu => 6, overflow_checking => "ON", underflow_checking => "ON", use_eab => "ON" ) конечно если я вижу нулевой размер (usedw = 0) я не обращаюсь в ФИФО. Но почему флаг full поднят. Пока со стороны контролера сделал заплату if (size == 0) { if (stus_rx_fifo && RX_FIFO_FULL_MASK) { //dummy read SPI_can_rd(opcode, 0, buff_in, 14); } return 0; }
  8. Такая вот проблема. С одной стороны посылаю данные - ФИФО заполняется с другой микроконтролером считываю данные - ФИФО опустошается. Вижу лед мигает - данные пришли\ушли. Ставлю точку останова в микроконтролере - естественно ФИФО переполняеися и full = 1. Убираю точку останова - и ничего не считывается - контролер читает usedw = 0 но с другой стороны full = 1 то есть флаг не чиститься. Что то можно настроить чтоб избежать такой проблемы?
  9. контролер stm32f303. функция записи во флеш - одинаковая, функция чтения из флеш - одинаковая. никаких предварительных настроек флеш я в обеих проектах не делаю. открыл два проекта и сравнил функции построчно. потому что я не знаю где именно в коде проблема. и в коде вообще.
  10. это чтение с терминала - с ним проблем нет. проблема в чтении из флеш.
  11. запись чтения поля в структуре uint32_t COM_MotParam(uint32_t argc, char** args) { int32_t argument = 0; int32_t minlim; int32_t val = 0; if (command.val_ptr != NULL) { if (argc > 0) //write parametr { argument = atoi(args[1]); if (command.var_type == VAR_TYPE_BYTE) *(uint8_t*)command.val_ptr = argument; else if (command.var_type == VAR_TYPE_INT) *(uint32_t*)command.val_ptr = argument; else if (command.var_type == VAR_TYPE_SHORT) *(uint16_t*)command.val_ptr = argument; } else //read parameter { if (command.var_type == VAR_TYPE_BYTE) val = *(uint8_t*)command.val_ptr; else if (command.var_type == VAR_TYPE_INT) val = *((uint32_t*)command.val_ptr); else if (command.var_type == VAR_TYPE_SHORT) val = *((uint16_t*)command.val_ptr); Parser_SendInt(COM_USART, val, 1, 0); } return MSG_OK; } запись во флеш size = sizeof(MOTOR_SYS_PARAMS); offset = 0; addr = (uint32_t *)(flash_page + offset); status = WriteFlash(&motor_sys_params, addr, size); чтение из флеш size = sizeof(MOTOR_SYS_PARAMS); offset=0; addr = (uint32_t *)(flash_page + offset); memcpy(&motor_sys_params, addr, size); интересно почему кривой код в одном проекте работает в другом нет.
  12. код одинаков в плане чтения записи переменной. я скорее думаю в настройках проекта IAR.
  13. Есть структура и в ней знаковое поле int32_t. Я пишу в это поле отрицательное значение mystruct.ival = -100; Потом сохраняю структуру во внутреннюю флэш и при ристарте считываю структуру из памяти и вижу mystruct.ival = -100. Есть такой же проект с тем же камнем с тем же кодом записи чтения во флэш. Но там при ристарте переменная не читается как отрицательная, и я получаю положительное число сколько то миллиардов. В чем может быть проблема?
  14. Value ячейки это строка. Если нужно извлечь число из ячейки - int.TryParse(varView.Rows[1].Cells[2].Value.ToString(), out myint); записать число в ячейку - varView.Rows[1].Cells[2].Value = myint.ToString();
  15. W5300 инициализация

    int32_t WIZNET_RunUdp(uint8_t sn, uint8_t* buf, uint16_t port) { int32_t ret; uint16_t size, sentsize; uint8_t destip[4] = {192, 168, 3, 10}; uint16_t destport = 2700; switch(getSn_SR(sn)) { case SOCK_UDP : if((size = getSn_RX_RSR(sn)) > 0) { if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; ret = recvfrom(sn, buf, size, destip, (uint16_t*)&destport); if(ret <= 0) { #ifdef _LOOPBACK_DEBUG_ printf("%d: recvfrom error. %ld\r\n",sn,ret); #endif return ret; } else { //LAN TO UART USART_SendBuf(USART1, buf, ret); } size = (uint16_t) ret; sentsize = 0; while(sentsize != size) { ret = sendto(sn, buf+sentsize, size-sentsize, destip, destport); if(ret < 0) { #ifdef _LOOPBACK_DEBUG_ printf("%d: sendto error. %ld\r\n",sn,ret); #endif return ret; } sentsize += ret; // Don't care SOCKERR_BUSY, because it is zero. } } break; case SOCK_CLOSED: #ifdef _LOOPBACK_DEBUG_ //printf("%d:UDP loopback start\r\n",sn); #endif if((ret = socket(sn, Sn_MR_UDP, port, 0x00)) != sn) return ret; #ifdef _LOOPBACK_DEBUG_ printf("%d:Opened, UDP loopback, port [%d]\r\n", sn, port); #endif break; default : break; } return 1; }