miv píše: ↑27. 1. 2025, 10:51
Úplně ti tam chybí čekání na dokončené vyslání. Prostě jsi tam nacpal data a předpokládáš, že je SPI připraven. To ovšem nemusí být pravda. Těmi delay jsi to zpomalil, takže to začalo nějak chodit. Prostuduj si pořádně ty funkce SPIWrite a spol. Máš k té knihovně určitě i zdrojáky, tam to uvidíš. A doporučuji i dokumentaci k CPU. Pak to vše budeš chápat lépe.
Z knihoven to není, ani jsem se doteď na žádnou nedíval, jel jsem podle toho článku (viz. první příspěvek). Ale teď jsem se podíval na něčí implementaci SPI zápisu :
Kód: Vybrat vše
unsigned char writeSPIByte(unsigned char data)
{
SSPSTATbits.BF = 0;
unsigned char i;
SSPBUF = data;
while(SSPSTATbits.BF == 0){}
return SSPBUF;
}
a jediné co má naopak, tak je to čtení příznaku BF z registru SSPSTAT, což je dle datasheetu (se kterým(i) se snažím pracovat ale častokrát z toho nejsem moc moudrý):
BF: Buffer Full Status bit (Receive mode only)
1 = Receive complete, SSPBUF is full
0 = Receive not complete, SSPBUF is empty
, aktuálně to teda mám takto pro zápis:
Kód: Vybrat vše
void SPI_Write_8(uint8_t Data)
{
SSPBUF = Data;
while (SSPSTATbits.BF == 0);
}
void SPI_Write_16(uint16_t Data)
{
SSPBUF = (Data >> 8);
while (SSPSTATbits.BF == 0);
//__delay_us(2);
SSPBUF = (Data & 0xFF);
while (SSPSTATbits.BF == 0);
//__delay_us(10);
//SPI_Write_8(Data >> 8);
//SPI_Write_8(Data & 0xFF);
}
a vypadá že to "funguje" - myšleno že jsem z mého malého testování nezpozoroval zaslání chybných bitů. Takže SPI teď asi chvíli nechám a jdu rozlouskat jak přepsat něčí knihovnu pro AD9833 pro arduino, které je v c++. Je to zapsané v třídách a musím to nějak rozluštit jak se s tím pracuje abych to byl schopen zapsat do C.
Btw. AD9833 potřebuje pro ovládání příjem 16ti bitů a PICem pošlu max 8, proto tam je ta funkce na zaslání 16ti - takže 2x volám zápis 8mi bitů.
Když odstraním ty delaye (jsou zakomentované v SPI_write_16) tak mám dvě možnosti jak poslat 2x 8 bitů.
1. 2x zavolat funkci pro zápis 8 bitů, výsledek:
2. 2x použít nahrání dat do SSPBUF a čekat, výsledek:
tento způsob má menší prodlevu
když jsem tam ty smyčky while neměl musel jsem tam dát delaye a byl jsem schopen ty prodlevy mezi 8 bity ještě více zkrátit (už si to nepamatuju kolik to bylo ale kolem 3us)
Ty smyčky while jsem odstranil (zakomentoval), protože když tam byly tak se mi to na nich zaseklo - asi protože nic krom logického analyzátoru nebylo připojeno na piny SDO a SDI. Teď jsem to udělal tak, že jsem ty piny navzájem spojil 1k odporem, takže to samé co se vyšle se i přijme.
No proč to píšu - protože jsem zvědavej, až (pokud) se mi podaří přepsat funkce pro ovládání AD9833, zda tyto prodlevy mezi každými 8mi bity nebudou vadit. Pokud si dobře vzpomínám, tak je potřeba zaslat i 16+.... (32?) bitů do registrů pro nastavení fáze/frekvence .