Пт мар 08, 2024 01:39:07
Вс мар 10, 2024 02:45:12
// Принять байт через SPI.
static uint8_t
spi2_read_byte() {
// Ждем, пока не освободится буфер передатчика.
while ( !(SPI2->SR & SPI_SR_TXE) ) {
}
SPI2->DR = 0; // запускаем обмен
// Ждем, пока не появится новое значение в буфере приемника.
while ( !(SPI2->SR & SPI_SR_RXNE) ) {
}
// Возвращаем значение буфера приемника.
return SPI2->DR;
}
// Передать байт через SPI.
static void
spi2_write_byte( uint8_t v) {
// Ждем, пока не освободится буфер передатчика.
while ( !(SPI2->SR & SPI_SR_TXE) ) {
}
// Заполняем буфер передатчика.
SPI2->DR = v;
// Ждем, пока не появится новое значение в буфере приемника.
while ( !(SPI2->SR & SPI_SR_RXNE) ) {
}
return;
}
...
reg_wizchip_spi_cbfunc( &spi2_read_byte, &spi2_write_byte);
...
Вт мар 12, 2024 02:48:45
// Принять байт через SPI.
static uint8_t
spi2_read_byte() {
int32_t i;
uint8_t v = 0;
for ( i = 0; i < 1000; ++i ) ;
// Ждем, пока не освободится буфер передатчика.
while ( !(SPI2->SR & SPI_SR_TXE) ) ;
SPI2->DR = 0; // запускаем обмен
// Ждем, пока не появится новое значение в буфере приемника.
while ( !(SPI2->SR & SPI_SR_RXNE) ) ;
// Получаем значение буфера приемника.
v = SPI2->DR;
for ( i = 0; i < 1000; ++i ) ;
return (v);
}
// Передать байт через SPI.
static void
spi2_write_byte( uint8_t v) {
int32_t i;
for ( i = 0; i < 1000; ++i ) ;
// Ждем, пока не освободится буфер передатчика.
while ( !(SPI2->SR & SPI_SR_TXE) ) ;
// Заполняем буфер передатчика.
SPI2->DR = v;
// Ждем, пока не появится новое значение в буфере приемника.
while ( !(SPI2->SR & SPI_SR_RXNE) ) ;
return;
}
Ср мар 13, 2024 06:48:10
Ср мар 13, 2024 13:19:28
while ( 1 ) {
GPIOB->BRR = GPIO_Pin_12;
spi2_write_byte( 0x5a);
spi2_write_byte( 0xa5);
GPIOB->BSRR = GPIO_Pin_12;
for ( j = 0; j < 1000; ++j ) ;
}
// Принять байт через SPI.
static uint8_t
spi2_read_byte() {
uint8_t v = 0;
// Start data exchange.
spi2_write_byte( 0x5a);
// Get input value from the r-buffer.
v = SPI2->DR;
return (v);
}
// Передать байт через SPI.
static void
spi2_write_byte( uint8_t v) {
// Put output value to the w-buffer.
SPI2->DR = v;
// Wait until w-buffer will be ready.
while ( !(SPI2->SR & SPI_SR_TXE) ) ;
// Wait until the transmition to be completed.
while ( (SPI2->SR & SPI_SR_BSY) ) ;
return;
}
During discontinuous communications, there is a 2 APB clock period delay between the write operation to SPI_DR and the BSY bit setting. As a consequence, in transmit-only mode, it is mandatory to wait first until TXE is set and then until BSY is cleared after writing the last data.
Ср мар 13, 2024 18:14:05
siderta писал(а):(Начинаю разбираться в программировании микроконтроллеров в принципе и stm32 в частности.)
Ср мар 13, 2024 23:17:12
siderta писал(а):...
while ( 1 ) {
int i;
uint8_t defip[4] = {0, 0, 0, 0};
for ( i = 0; i < 1*1000; ++i ) ;
getSIPR( defip);
#if 0
usart_print_string( USART1, "wiznet_init: ");
usart_print_number( USART1, defip[0]);
usart_print_string( USART1, ".");
usart_print_number( USART1, defip[1]);
usart_print_string( USART1, ".");
usart_print_number( USART1, defip[2]);
usart_print_string( USART1, ".");
usart_print_number( USART1, defip[3]);
usart_print_string( USART1, "\n");
#endif
for ( i = 0; i < 1*100; ++i ) ;
setSIPR( netInfo.ip);
}
// Передать байт через SPI и вернуть полученный по SPI байт.
static uint8_t
spi2_write_read_byte( uint8_t v) {
// Put output value to the w-buffer.
SPI2->DR = v;
// Wait until w-buffer will be ready.
while ( !(SPI2->SR & SPI_SR_TXE) ) ;
// Wait until the transmition to be completed.
while ( (SPI2->SR & SPI_SR_BSY) ) ;
// Wait until r-buffer will be ready.
while ( !(SPI2->SR & SPI_SR_RXNE) ) ;
// Get input value from the r-buffer.
v = SPI2->DR;
return (v);
}
// Принять байт через SPI.
static uint8_t
spi2_read_byte() {
uint8_t v = spi2_write_read_byte( 0x5a);
return (v);
}
// Передать байт через SPI.
static void
spi2_write_byte( uint8_t v) {
spi2_write_read_byte( v);
return;
}
Чт мар 14, 2024 08:35:54
////////////////////////////////////////////////////////////////////////////////
// предоставляем библиотеке возможности:
void cris_en( void )
{
semaphore -> takeWithBlock();
}
void cris_ex( void )
{
semaphore -> give();
}
////////////////////////////////////////////////////////////////////////////////
// Включить модуль W5500 сигналом SCNn=0
void cs_sel( void )
{
cs_pin -> write( OFF );
}
////////////////////////////////////////////////////////////////////////////////
// Выключить модуль W5500 сигналом SCNn=1
void cs_desel( void )
{
while( wiz_spi -> SR & SPI_SR_BSY )
{
}
cs_pin -> write( ON );
}
////////////////////////////////////////////////////////////////////////////////
// Цикл обмена по SPI
inline uint8
spi_exchange( uint8 _aByte )
{
uint8
tmp8;
uint32
prot;
prot = 10'000'000;
while( wiz_spi -> SR & SPI_SR_RXNE )
{
tmp8 = wiz_spi -> DR;
prot--;
if( prot == 0 )
{
break;
}
};
*( volatile uint8 *)&( wiz_spi -> DR) = _aByte;
prot = 10'000'000;
while( !( wiz_spi -> SR & SPI_SR_RXNE ) )
{
prot--;
if( prot == 0 )
{
break;
}
}
tmp8 = *( volatile uint8*)&( wiz_spi -> DR );
return( tmp8 );
}
////////////////////////////////////////////////////////////////////////////////
// принять байт через SPI
uint8
spi_rb( void )
{
return( spi_exchange( 0 ) );
}
////////////////////////////////////////////////////////////////////////////////
// передать байт через SPI
void
spi_wb( uint8_t _aByte )
{
spi_exchange( _aByte );
}
////////////////////////////////////////////////////////////////////////////////
reg_wizchip_cs_cbfunc( cs_sel, cs_desel );
reg_wizchip_spi_cbfunc( spi_rb, spi_wb );
Чт мар 14, 2024 16:01:30