Цитата(wasp @ Apr 29 2008, 23:57)

вот код программки, может кому что в глаза бросится, буду премного благодарен
Скачал описание модуля по ссылке из первого поста. Не нашел в нем команд 0xD040, 0xC823.
Раз уж ветка по С:
1) Ээх, не любите вы себя - потратьте час, присвойте всем битам (и/или их комбинациям) осмысленные имена через #define и потом пишите WriteCMD( SET_CONFIG | BAND_433 | CLK_2MHZ | LOAD_CAP_11_5_PF | M1 ) - и программа читабельная станет и вероятность ошибиться гораздо меньше.
2) вот вам предложение:
Код
void WriteCMD( uint CMD )
{
uchar n=16;
// SCK тут уже равно 0
nSEL=0;
do
{
if (CMD & (1 << 15) )
SDI = 1;
else
SDI = 0;
SCK = 1;
CMD <<= 1; // в это время выдерживается пауза высокого уровня SCK, хотя она тут и не нужна, между командами все равно больше 25 нс
SCK = 0;
}
while (--n); // во время перехода по циклу выдерживается пауза низкого уровня SCK, хотя она тут и не нужна.
// и тут SCK уже равно 0.
nSEL=1;
}
циклы do {} while (--var); компилируются эффективнее, чем while(n--) {}. Длинные nop не нужны - по даташиту длительность высокого и низкого уровней SCK должна быть не меньше 25 нс, у вас процессор при всем желании так быстро ногами дергать не сможет. SDI после этой функции может оставаться в любом состоянии и сбрасывать его при инициализации тоже необязательно.
3) сделайте отдельную функцию для
Код
WriteFSKbyte( n );
ChkSum += n;
исключите возможность ошибки "передали одно, а прибавили другое".
4)Какой смысл команды 0xCC00 в вашем тексте? Она выдает содержимое регистра статуса во время последних 8 импульсов SCK, но вы его не читаете. Для начала добейтесь, чтобы модуль вам ответил что-то осмысленное на эту команду. Зациклите ее, засинхронизируйте осциллограф от nSEL, посмотрите, что творится на ногах.