Atmega8535+Mcp23S17

11-05-2013, 11:13 От: admin Посмотрели: 1172
Привет всем!



Взгляните на данный код:



#include <mega8535.h>
// MCP23S17 SPI Slave Device
#define SPI_SLAVE_ID 0x40
#define SPI_SLAVE_ADDR 0x00
#define SPI_SLAVE_WRITE 0x00
#define SPI_SLAVE_READ 0x01// MCP23S17 Registers Definition for BANK=0 (default)
#define IODIRA 0x00
#define IODIRB 0x01
#define IOCONA 0x0A
#define GPPUA 0x0C
#define GPPUB 0x0D
#define GPIOA 0x12
#define GPIOB 0x13


#define SPI_CS 0
// SPI functions
#define SPI_ACTIVE_SS(PORT,SPI_CS) PORT &= ~(1<<SPI_CS);
#define SPI_UNACTIVE_SS(PORT,SPI_CS) PORT |= (1<<SPI_CS);
// Declare your global variables here

void SPI_write(unsigned char addr,unsigned char data)
{
SPI_ACTIVE_SS(PORTB,0);
SPDR = SPI_SLAVE_ID | ((SPI_SLAVE_ADDR << 1) & 0x0E)| SPI_SLAVE_WRITE;
while(!(SPSR & (1<<SPIF)));
SPDR = addr;
while(!(SPSR & (1<<SPIF)));
SPDR = data;
while(!(SPSR & (1<<SPIF)));
SPI_UNACTIVE_SS(PORTB,0);
}

interrupt [TIM2_OVF] void timer0_ovf(void)
{

TCNT2=200;





}
void main(void)
{

PORTA=0x01;
DDRA=0x00;


DDRB=0xB1;


ASSR=0x00;
TCCR2=0x07;
TCNT2=200;
OCR2=0x00;

TIMSK=(1<<TOIE2);

ACSR=0x80;
SFIOR=0x00;

SPCR=0x50;
SPSR=0x00;

SPI_write(IOCONA,0x20); // I/O Control Register: BANK=0, SEQOP=1, HAEN=1 (Enable Addressing)
SPI_write(IODIRA,0x00); // GPIOA As Output
//SPI_Write(IODIRB,0xFF); // GPIOB As Input
//SPI_Write(GPPUB,0xFF); // Enable Pull-up Resistor on GPIOB
SPI_write(GPIOA,0x00);
#asm("sei")
while(1)
{
if (!(PINA&0x01)){
SPI_write(GPIOA ,0x01);
}
else
SPI_write(GPIOA ,0x00);
}

}

Данный простейший код который просто проверяет на правильность написанного кода для расширителя порта MCP23S17. На протеусе симулируется на гуд. А в реале Обнаруживается постоянная лог.1 в регистре MOSI при просмотре осциллографом.

А если в цикле while кода изменить так:


while(1)
{

SPI_write(GPIOA ,0x01);
SPI_write(GPIOA ,0x00);

}

}

То код работает и MOSI работает как надо.

Помогите люди с данной проблемой!! Кстати данный код работает только регистром MOSI, но ни как не влияет на работу расширителя в реале. А в протуесе даже бесконечная отправка данных по SPI влияет на работу расширителя то есть регистре GPA0 наблюдается изменение. Схему показывать не буду так как там ничего не обычного



-> питание общее для всей схемы

-на МК (с фильтром по питанию) - +5V

-на MCP23S17(без фильтра) - +5V



->ножки MOSI MISO SCK SS(CS)

-подключены на прямую \\MISO-SO\\ MOSI-SI\\ SCK-SCK\\ SS(PORTB.0)-CS



-> ножка RESET

-в МК не натянута на питание через 10кОмный резистор(т.к. пока это не важно)

-в MCP23S17 ножку подал +5V.



->MCP23S17

-ножка GPA0 подана на LED с резистором номиналом 120 Ом

-ножки A0 A1 A2 - не затронуты.

Какую инфу дать еще для быстрой помощи от Уважаемых форумчан?

Вот проект, писал на другом форусе, но там не смогли мне помочь.

http://chipenable.ru/media/kunena/attachments/8897/Spi-mcp23.rar

Раздел: AVR

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться, либо войти на сайт под своим именем.

Обсудить на форуме


На момент добавления Atmega8535+Mcp23S17 все ссылки были рабочие.
Все публикации статей, книг и журналов, представлены на этом сайте, исключительно для ознакомления,
авторские права на эти публикации принадлежат авторам статей, книг и издательствам журналов!
Подробно тут | Жалоба

Добавление комментария

Ваше имя:*
E-Mail:*
Текст:
Вопрос:
Решите уравнения x+2x=789
Ответ:*
Введите два слова, показанных на изображении:



Опрос

Ваши предпочтения в TRX


Одинарное преобразование
Двойное преобразование
Прямое преобразование
SDR
Другое
Мне всё равно

Календарь новостей
«    Апрель 2024    »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
2930