Ребята, снова стучу в эту тему((( Недавно обнаружила, что SPI у меня только один раз нормально считывает, а дальше либо какая-то чушь, либо неправильно. Проблема в том, что какой адрес я бы не задавала, например в цикле 10 раз считать по адресу 0х00, возвращается в ответ строка с разными символами, а должны же быть одни и те же. Задаю разные адреса, а приходит одна и та же строка в ответ. Кто-нибудь знает в чем моя проблема...
вот настройка SPI2
Код
void SPI_Master_Config()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
GPIO_InitTypeDef port;
port.GPIO_Mode = GPIO_Mode_AF_PP;
port.GPIO_Pin = SCK|MOSI;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(Port, &port);
GPIO_InitTypeDef port1;
port1.GPIO_Mode = GPIO_Mode_Out_PP;
port1.GPIO_Pin =S;
port1.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(Port, &port1);
Port->ODR|=S;
GPIO_InitTypeDef port2;
port2.GPIO_Mode = GPIO_Mode_IN_FLOATING;
port2.GPIO_Pin =MISO;
port2.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(Port, &port2);
SPI_InitTypeDef spi;
SPI_StructInit(&spi);
spi.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
spi.SPI_Mode = SPI_Mode_Master;
spi.SPI_DataSize = SPI_DataSize_8b;
spi.SPI_CPOL = SPI_CPOL_High;
spi.SPI_CPHA = SPI_CPHA_2Edge;
spi.SPI_NSS = SPI_NSS_Soft;
spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
spi.SPI_FirstBit = SPI_FirstBit_MSB;
spi.SPI_CRCPolynomial = 7;
SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);
SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_TXE,ENABLE);
SPI_Init(SPI2, &spi);
SPI_Cmd(SPI2, ENABLE);
}
Вот опрос микросхемы памяти:
Код
u8 READ(u16 adress)
{
Port->ODR&=~S;
SPI_I2S_SendData(SPI2,0b00000011);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);
SPI_I2S_SendData(SPI2,adress);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);
SPI_I2S_SendData(SPI2,0b00000000);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);
err=SPI_I2S_ReceiveData(SPI2);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);
SPI_I2S_SendData(SPI2,0b00000000);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);
return SPI_I2S_ReceiveData(SPI2);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);
Port->ODR|=S;
}
вот сама функция записи в массив из десяти символов (с адреса 0х00...0х09)
Код
void read_string()
{
for(i=0;i<10;i++)
mass[i]=READ(i);
}
Пока смотрела, поняла, что после RETURN больше-то ничего не выполняется... ИСПРАВИЛА НА ТАКОЙ КОД.
Код
u8 READ(u16 adress)
{
Port->ODR&=~S;
SPI_I2S_SendData(SPI2,0b00000011);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);
SPI_I2S_SendData(SPI2,adress);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);
SPI_I2S_SendData(SPI2,0b00000000);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);
err=SPI_I2S_ReceiveData(SPI2);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);
SPI_I2S_SendData(SPI2,0b00000000);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);
mass[i]=SPI_I2S_ReceiveData(SPI2);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);
Port->ODR|=S;
}
и функцию считывания строки:
Код
void read_string()
{
for(i=0;i<10;i++)
READ(i);
}
теперь с последним приведенным кодом каждый раз с одного и того же адреса считывает одно и тоже.
Есть другие вопросы:
1) Где здесь вообще, по-вашему мнению, ошибки
2) Подключаю плату с др.такой же микросхемой памяти (но питание ниже, чем требуется), может ли из-за этого не считываться ничего с карты памяти?
3) Очень хочу что-нибудь записать в память. Но бьюсь без толку, ничего не пишет в память ни по какому адресу. Не понимаю, что именно не так.
по документации WREN-> WRITE-> WRDI. ПРОСТИТЕ, что так много вопросов. Они насущные)
Сообщение отредактировал Ekka - May 17 2016, 07:42