Привет всем!
Взгляните на данный код:
Данный простейший код который просто проверяет на правильность написанного кода для расширителя порта MCP23S17. На протеусе симулируется на гуд. А в реале Обнаруживается постоянная лог.1 в регистре MOSI при просмотре осциллографом.
А если в цикле while кода изменить так:
То код работает и 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
Взгляните на данный код:
#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