Цитата(Сергей Борщ @ Apr 30 2008, 03:33)

Скачал описание модуля по ссылке из первого поста. Не нашел в нем команд 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;
}
Спасибо большое!
Действительно так гораздо компактнее.
Цитата
Какой смысл команды 0xCC00 в вашем тексте? Она выдает содержимое регистра статуса во время последних 8 импульсов SCK, но вы его не читаете. Для начала добейтесь, чтобы модуль вам ответил что-то осмысленное на эту команду. Зациклите ее, засинхронизируйте осциллограф от nSEL, посмотрите, что творится на ногах.
Сделал как Вы посоветовали, обнаружилось, что на выходе SDI постоянно ноль.
Код
void RF2_Init( void )
{
nSEL=1;
SDI=1;
SCK=0;
FSK=0;
}
void main()
{
RF2_Init();
while (1)
{
WriteCMD( 0xCC00 );
}
}
/*****************************************************************/
void WriteCMD( uint CMD )
{
uchar n=16;
// SCK тут уже равно 0
nSEL=0;
do
{
if (CMD & 0x8000)
SDI = 1;
else
SDI = 0;
SCK = 1;
CMD = CMD<<1; // в это время выдерживается пауза высокого уровня SCK, хотя она тут и не нужна, между командами все равно больше 25 нс
SCK = 0;
}
while (--n); // во время перехода по циклу выдерживается пауза низкого уровня SCK, хотя она тут и не нужна.
// и тут SCK уже равно 0.
nSEL=1;
}
причем клок синал SCK и nSEL идут , а SDI нету
Причем даже когда делаю так:
Код
if (CMD & 0x8000)
SDI = 1;
else
SDI = 1;
все равно ноль.
Причем когда делаю так:
Код
// if (CMD & 0x8000)
SDI = 1;
// else
SDI = 0;
генерит...
Что это - ошибка компилятора или мои кривые руки?
Да, компилер CCS_PCWHD_v4.057