реклама на сайте
подробности

 
 
> SPI на SAM7X256, диплом горит!
Metal
сообщение May 16 2006, 11:06
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 16-05-06
Пользователь №: 17 143



Привет, нужны примеры исходников взаимодействия 2х sam7x256 по SPI, и вообще любые примеры использования SPI на этом или сходных МК. Заранее спасибо! мое мыло: strelokk@hotmail.ru
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Shuuura
сообщение May 17 2006, 06:48
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 80
Регистрация: 23-08-05
Пользователь №: 7 902



//конфигурировать SPI
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_SPI ) ;
AT91F_SPI_Reset(AT91C_BASE_SPI);

//определяет регистр SPI_MR
AT91F_SPI_CfgMode(AT91C_BASE_SPI,
AT91C_SPI_MSTR | //мастер
AT91C_SPI_PS_FIXED | //фиксирования периферия
AT91C_SPI_MODFDIS | //Mode fault detection is disabled.
((0x00 << 24) & AT91C_SPI_DLYBCS)
);

AT91C_BASE_SPI->SPI_CR = AT91C_SPI_LASTXFER | AT91C_SPI_SPIEN;
AT91C_BASE_SPI->SPI_TDR = AT91C_SPI_LASTXFER;


//использую аппартный CS, хотя можно использовать и любые ножки.
//при использовании аппаратных СS заранее сконфигурировать соответствующие функции PIO контроллера
//устанавливает биты PCS в регистре SPI_MR
for(i=0;i<4;i++){
//определяет регистры SPI_CSR0... SPI_CSR3
AT91F_SPI_CfgCs(AT91C_BASE_SPI,
i,//номер регистра
// AT91C_SPI_CPOL | //SPI mode 3
AT91C_SPI_BITS_16 |//Передаем по 16 бит
// AT91C_SPI_CSAAT | //оставить СS активным после окончания передачи
((0x02 << 8) & AT91C_SPI_SCBR) | //Serial Clock Baud Rate (делитель мастер клока)
((0x01 << 24) & AT91C_SPI_DLYBCT)|
((0x10 << 16) & AT91C_SPI_DLYBS)
); //Delay Between Consecutive Transfers
}


AT91F_PDC_EnableRx(AT91C_BASE_PDC_SPI);
AT91F_PDC_EnableTx(AT91C_BASE_PDC_SPI);
AT91F_PDC_Open(AT91C_BASE_PDC_SPI);


//отправка слова данных (отпарвлять можно от 8 до 16 бит)

//0x0e - выбор ножки CS
while (!((AT91C_BASE_SPI->SPI_SR) & AT91C_SPI_TXEMPTY));
//здесь выбирается ножка CS
AT91F_SPI_CfgPCS(AT91C_BASE_SPI,0x0E);
AT91F_SPI_PutChar(AT91C_BASE_SPI,data, 0x0E));


// отправка через PDC
while (!((AT91C_BASE_SPI->SPI_SR) & AT91C_SPI_TXEMPTY));
AT91F_SPI_CfgPCS(AT91C_BASE_SPI,0x0E);
AT91F_SPI_SendFrame(AT91C_BASE_SPI, (char*)(data_pointer),data_size , 0, 0);
while(!AT91F_PDC_IsRxEmpty(AT91C_BASE_PDC_SPI));

пользуйтесь PDC - отличная вешь (особенно после работы с AVR)

аналогично делается прием, полько надо помнить, что для приема вначале надо что-нибудь отправить, а потом считывать данные из регистра приема.

Смотрите ww.AT91.com - там есть хороший форум
Go to the top of the page
 
+Quote Post
Master
сообщение May 18 2006, 15:12
Сообщение #3


Частый гость
**

Группа: Новичок
Сообщений: 170
Регистрация: 26-05-05
Из: Москва
Пользователь №: 5 405



Цитата(Shuuura @ May 17 2006, 10:48) *
//конфигурировать SPI
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_SPI ) ;
AT91F_SPI_Reset(AT91C_BASE_SPI);
Здесь было бы неплохо сконфигурировать ноги:
Код
    AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA,         // PIO controller base address
        ((UINT) AT91C_PA11_NPCS0    ) |
        ((UINT) AT91C_PA12_MISO        ) |
        ((UINT) AT91C_PA13_MOSI        ) |
        ((UINT) AT91C_PA14_SPCK        ) |
        ((UINT) AT91C_PA31_NPCS1    ),    // Peripheral A
        ((UINT) AT91C_PA3_NPCS3        ) |
        ((UINT) AT91C_PA30_NPCS2    ) );    // Peripheral B
А до этого включить частоту на PIO (впрочем, здесь не уверен).
Цитата
//определяет регистр SPI_MR
AT91F_SPI_CfgMode(AT91C_BASE_SPI,
AT91C_SPI_MSTR | //мастер
AT91C_SPI_PS_FIXED | //фиксирования периферия
AT91C_SPI_MODFDIS | //Mode fault detection is disabled.
((0x00 << 24) & AT91C_SPI_DLYBCS)
);

AT91C_BASE_SPI->SPI_CR = AT91C_SPI_LASTXFER | AT91C_SPI_SPIEN;
AT91C_BASE_SPI->SPI_TDR = AT91C_SPI_LASTXFER;


//использую аппартный CS, хотя можно использовать и любые ножки.
Можно-то оно конечно можно. Только выбирать CS придётся. Да так, чтобы одна из ног опускалась. Возразите, если сможете.
Цитата
//при использовании аппаратных СS заранее сконфигурировать соответствующие функции PIO контроллера
//устанавливает биты PCS в регистре SPI_MR
for(i=0;i<4;i++){
//определяет регистры SPI_CSR0... SPI_CSR3
AT91F_SPI_CfgCs(AT91C_BASE_SPI,
i,//номер регистра
// AT91C_SPI_CPOL | //SPI mode 3
AT91C_SPI_BITS_16 |//Передаем по 16 бит
// AT91C_SPI_CSAAT | //оставить СS активным после окончания передачи
((0x02 << 8) & AT91C_SPI_SCBR) | //Serial Clock Baud Rate (делитель мастер клока)
((0x01 << 24) & AT91C_SPI_DLYBCT)|
((0x10 << 16) & AT91C_SPI_DLYBS)
); //Delay Between Consecutive Transfers
}


AT91F_PDC_EnableRx(AT91C_BASE_PDC_SPI);
AT91F_PDC_EnableTx(AT91C_BASE_PDC_SPI);
AT91F_PDC_Open(AT91C_BASE_PDC_SPI);


//отправка слова данных (отпарвлять можно от 8 до 16 бит)

//0x0e - выбор ножки CS
while (!((AT91C_BASE_SPI->SPI_SR) & AT91C_SPI_TXEMPTY));
//здесь выбирается ножка CS
AT91F_SPI_CfgPCS(AT91C_BASE_SPI,0x0E);
AT91F_SPI_PutChar(AT91C_BASE_SPI,data, 0x0E));


// отправка через PDC
while (!((AT91C_BASE_SPI->SPI_SR) & AT91C_SPI_TXEMPTY));
AT91F_SPI_CfgPCS(AT91C_BASE_SPI,0x0E);
AT91F_SPI_SendFrame(AT91C_BASE_SPI, (char*)(data_pointer),data_size , 0, 0);
while(!AT91F_PDC_IsRxEmpty(AT91C_BASE_PDC_SPI));

пользуйтесь PDC - отличная вешь (особенно после работы с AVR)

аналогично делается прием, полько надо помнить, что для приема вначале надо что-нибудь отправить, а потом считывать данные из регистра приема.

Смотрите ww.AT91.com - там есть хороший форум
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01386 секунд с 7
ELECTRONIX ©2004-2016