ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
720921 Топик полностью
Dingo (16.12.2016 15:41 - 17.12.2016 06:01, просмотров: 209) ответил il-2 на Тогда для твоего случая надо использовать в качестве nCS любой вывод МК в режиме GPIO. И установить SSM=1 и SSI=1, чтобы нога NSS не влияла на работу SPI и могла бы использоваться по другим назначениям.
[UPD]Так и делаю. При попытке рулить активностью SPI посредством бита SSI прерывания прикидываются шлангом. Или надо после выставления бита ещё и SPE перевыставить? Можно ли при управлении через SPE гарантировать целостность данных (SPIx->DR) после сброса бита? Ещё интересный момент: в обработчик прерывания периодически попадаю при SPIx->SR равном 0x80 или 0x00. То есть нет ошибок, событий приёма или передачи, а вызов обработчика есть. Активность флага занятости?... UPD: Примитивный трассер и его вывод, ещё сам не анализировал. void SPI1_IRQHandler(void) { GPIO_WriteBit( GPIOA, GPIO_Pin_4, Bit_SET); static int xcall = 0; // xcall++; arr[xcall++] = __LINE__; arr[xcall++] = ADC_SPIIF->SR; if ( byte_count < 3) { arr[xcall++] = __LINE__; // Receive something // if (SPI_I2S_GetITStatus(ADC_SPIIF, SPI_I2S_IT_RXNE) == SET) { arr[xcall++] = __LINE__; SPI_I2S_ReceiveData( ADC_SPIIF); } // Transmiter ready // if (SPI_I2S_GetITStatus(SPI1, SPI_I2S_IT_TXE) == SET) { arr[xcall++] = __LINE__; byte_count++; SPI_I2S_SendData( ADC_SPIIF, 0xF2); } msg = "P\r\n"; } else { arr[xcall++] = __LINE__; // Receive something // if (SPI_I2S_GetITStatus(ADC_SPIIF, SPI_I2S_IT_RXNE) == SET) { arr[xcall++] = __LINE__; SPI_I2S_ReceiveData( ADC_SPIIF); adc_Release(); } // Transmiter ready // if (SPI_I2S_GetITStatus(SPI1, SPI_I2S_IT_TXE) == SET) { arr[xcall++] = __LINE__; byte_count++; //SPI_I2S_SendData( ADC_SPIIF, 0xA3); } msg = "O\r\n"; if (xcall >= 100) xcall = 0; } // Error flag// if (SPI_I2S_GetITStatus( ADC_SPIIF, SPI_I2S_IT_ERR) == SET) { arr[xcall++] = __LINE__; msg = "E\r\n"; } GPIO_WriteBit( GPIOA, GPIO_Pin_4, Bit_RESET); } printf("t:%d\r\n", SysTime); for ( int i=0; i<=100; i++) { printf("%4u\t", arr[i]); arr[i] = 0; } // ........................ if ( msg != NULL) { printf("M:%s\r\n", msg); msg = NULL; }
t:30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 M:P t:1030 198 128 202 213 198 128 202 198 129 202 206 213 198 128 202 198 129 202 206 213 198 128 219 198 129 219 223 230 198 130 219 230 198 3 219 223 230 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 M:P t:2030 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 198 128 202 213 198 128 202 198 129 202 206 213 198 128 202 198 129 202 206 213 198 128 219 198 129 219 223 230 198 130 219 230 198 3 219 223 230 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 M:P t:3030 198 130 219 230 198 3 219 223 230 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 198 128 202 213 198 128 202 198 129 202 206 213 198 128 202 198 129 202 206 213 198 128 219 198 129 219 223 M:P