[uquote="Chettuser",url="/forum/viewtopic.php?p=3695815#p3695815"]Как переписать дефайн, чтобы заработало?[/uquote]Оба варианта рабочие. Ошибка скорее всего где-то в другом месте по коду выше. Это и есть слабое место макросов - плохо отлаживать. Во втором варианте аргумент cd надо в скобки взять.
Код: Выделить всё
#define SPI_Tx(cd) while (SPI1->SR & SPI_SR_BSY); SPI1->DR = (uint16_t)(cd)
[uquote="Chettuser",url="/forum/viewtopic.php?p=3695815#p3695815"]есть ещё способы?[/uquote]Функцию надо оформлять функцией и не парить себе мозги.
Код: Выделить всё
static inline void SPI_Tx(uint32_t cd)
{
while (SPI1->SR & SPI_SR_BSY);
*(uint16_t *)&SPI1->DR = cd;
}
Обрати внимание, я включил интуицию и предположил, что тебе нужна 16-битная операция записи в регистр SPI->DR. Это делается так как у меня в функции, а не как у тебя в макросе. Ну и (data|0x00) это прикол такой?
ЗЫ: На самостоятельную проработку предлагаю подумать что будет с таким применением твоего макроса и функции.
Код: Выделить всё
if(data==0xAA)
SPI_Tx(data|0x01);
else
SPI_Tx(data|0x02);
Поэтому макрос вообще правильно вот так
Код: Выделить всё
#define SPI_Tx(cd) do{while (SPI1->SR & SPI_SR_BSY); SPI1->DR = (uint16_t)(cd);}while(false)