Dubov 0 16 ноября, 2014 Опубликовано 16 ноября, 2014 (изменено) · Жалоба Настроил SPI как мастер, передаю данные. на ноге MOSI данные есть, на MISO нету. Глянул ногу CLK осциллографом - удивился(см. фото) Что может быть не так? Код инициализации клока SPI: SPIClkConfigure(SOC_SPI_1_REGS, 150000000, 10000000, SPI_DATA_FORMAT0); тело функции void SPIClkConfigure(unsigned int baseAdd, unsigned int moduleClk, unsigned int spiClk, unsigned int dataFormat) { unsigned int prescale; prescale = (moduleClk/spiClk) + 1; HWREG(baseAdd + SPI_SPIFMT(dataFormat)) = \ (SPI_SPIFMT_PRESCALE & (prescale << SPI_SPIFMT_PRESCALE_SHIFT)); } Изменено 16 ноября, 2014 пользователем Dubov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lemorus 0 16 ноября, 2014 Опубликовано 16 ноября, 2014 · Жалоба А разве на ногу MISO не должно данные выдавать внешнее устройство. Если оно не подключено, или висит, или у него не работает SPI. Вот оно и не отвечает. Может чип селект не заведен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 16 ноября, 2014 Опубликовано 16 ноября, 2014 · Жалоба Что может быть не так? Да вроде, все так. Вы же данные передаете, вот они на MOSI и идут. А что не так то? Частота CLK? По этой части, либо у Вас тактируется SPI не тем, о чем Вы думаете, либо коэффициент деления не туда заносится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dubov 0 16 ноября, 2014 Опубликовано 16 ноября, 2014 · Жалоба Частота клока должна быть 10Мгц (судя по коду). На фото сами видите что гараздо больше. АЦП с которого данные должшы передаваться принимает чипселект и генерит прерывание для процессора. А данные не идут... Тот клок что видно на осциллографе слишком высокий по частоте. Ацп работает с клоком передачи данных не больше 20кГц. Частота клока должна быть 10Мгц (судя по коду). На фото сами видите что гараздо больше. АЦП с которого данные должшы передаваться принимает чипселект и генерит прерывание для процессора. А данные не идут... Тот клок что видно на осциллографе слишком высокий по частоте. Ацп работает с клоком передачи данных не больше 20кГц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 17 ноября, 2014 Опубликовано 17 ноября, 2014 · Жалоба Во первых, не видно, где, собственно, задается DFSEL=0 при передаче. А то, может быть, Вы data format #0 определяете, а используете #2. Во вторых, совершенно непонятно, на сколько верны всевозможные макросы, соответствуют ли реальным адресам. В третьих, совершенно непонятно из кода, какая реальная частота идет на тактирование модуля. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dubov 0 17 ноября, 2014 Опубликовано 17 ноября, 2014 (изменено) · Жалоба Во первых, не видно, где, собственно, задается DFSEL=0 при передаче. А то, может быть, Вы data format #0 определяете, а используете #2. Во вторых, совершенно непонятно, на сколько верны всевозможные макросы, соответствуют ли реальным адресам. В третьих, совершенно непонятно из кода, какая реальная частота идет на тактирование модуля. Я использую StarterWare. Функция инициализации SPI: static void SPI_init(void) { unsigned int val = 0xE00; // 3-wire mode // Waking up the SPI1 instance PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_SPI1, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); SPIPinMuxSetup(1); SPIReset(SOC_SPI_1_REGS); SPIOutOfReset(SOC_SPI_1_REGS); SPIModeConfigure(SOC_SPI_1_REGS, SPI_MASTER_MODE); SPIClkConfigure(SOC_SPI_1_REGS, 150000000, SPI_CLK, SPI_DATA_FORMAT0); SPIPinControl(SOC_SPI_1_REGS, 0, 0, &val); // Configures SPI Data Format Register /* Configures the polarity and phase of SPI clock */ SPIConfigClkFormat(SOC_SPI_1_REGS, (SPI_CLK_POL_HIGH | SPI_CLK_INPHASE), SPI_DATA_FORMAT0); /* Configures SPI to transmit MSB bit First during data transfer */ SPIShiftMsbFirst(SOC_SPI_1_REGS, SPI_DATA_FORMAT0); /* Sets the Charcter length */ SPICharLengthSet(SOC_SPI_1_REGS, CHAR_LENGTH, SPI_DATA_FORMAT0); SPIDat1Config(SOC_SPI_1_REGS, SPI_DATA_FORMAT0, 0x1); GPIOPinWrite(SOC_GPIO_0_REGS, 48, GPIO_PIN_HIGH); // Enable SPI communication SPIEnable(SOC_SPI_1_REGS); } CS я дёргаю руками через GPIO. просто выставляю перед отправкой "0", после отправки "1". Так и не понял как аппаратно его задать. Но не суть. Настройка SPIDat1 /** * \brief - Configures the SPIDat1 Register.It won't write to TX part * of the SPIDat1 Register.\n * * \param - baseAdd is the Memory Address of the SPI data instance used.\n * \param - flag is value to Configure CSHOL,Wait Delay Conter Enable bit * and to select the appropriate DataFormat register.\n * * flag can take following values.\n * * SPI_CSHOLD - To Hold the CS line active after data Transfer * untill new data and Control information is * loaded.\n * * SPI_DELAY_COUNTER_ENA - Enables Delay Counter.\n * * SPI_DATA_FORMAT0 - To select DataFormat Register 0.\n * SPI_DATA_FORMAT1 - To select DataFormat Register 1.\n * SPI_DATA_FORMAT2 - To select DataFormat Register 2.\n * SPI_DATA_FORMAT3 - To select DataFormat Register 3.\n * * \param - cs is the value to driven on CS pin(line).\n * * \return none. **/ void SPIDat1Config(unsigned int baseAdd, unsigned int flag, unsigned char cs) { unsigned char *ptr = (unsigned char*)(baseAdd + SPI_SPIDAT1); unsigned char dcs; *(ptr+3) = (char)((flag >> 24) | (flag & (SPI_SPIDAT1_DFSEL >> SPI_SPIDAT1_DFSEL_SHIFT))); dcs = HWREG(baseAdd + SPI_SPIDEF ) & (SPI_SPIDEF_CSDEF); *(ptr+2) = cs ^ dcs; } функция вызываемая в прерывании от внешнего АЦП void SWI_ADСrecv() { int i = 0; static int j = 0; GPIOPinWrite(SOC_GPIO_0_REGS, 48, GPIO_PIN_LOW); for(i=0; i<16;i++) { SPITransmitData1(SOC_SPI_1_REGS, dummy); while(HWREG(SOC_SPI_1_REGS + SPI_SPIBUF)&SPI_SPIBUF_RXEMPTY); PongBuf[j] = SPIDataReceive(SOC_SPI_1_REGS); j++; if(j == 2048) j = 0; } GPIOPinWrite(SOC_GPIO_0_REGS, 48, GPIO_PIN_HIGH); } Изменено 17 ноября, 2014 пользователем Dubov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 17 ноября, 2014 Опубликовано 17 ноября, 2014 · Жалоба После всех настроек посмотрите отладчиком, что в регистрах реально записалось. Подозреваю, что тут какие-то нестыковки с индексами. Например, индексы-макросы рассчитаны на индексацию типа (int*), а вы их прибавляете как байтовые смещения, ну или наоборот, или что-то в этом роде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться