Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 18.06.2012, 08:39  
cel128
Частый гость
 
Регистрация: 25.11.2011
Сообщений: 16
Сказал спасибо: 2
Сказали Спасибо 1 раз в 1 сообщении
cel128 на пути к лучшему
По умолчанию lpc1114 и spi eeprom m95m01

Добрый день!
Не могу никак подружить эту связку.
С шины постоянно читается 0xFF. Документацию уже проштудировал, примеры от кейла тоже. SSel эмулирую портом (не средствами контроллера spi, а средствами gpio).
Вот куски кода:
инициализация:
Код:
// spi0 init
	LPC_IOCON-›SWCLK_PIO0_10 = 0xC2;
	LPC_IOCON-›PIO0_9 = 0xD1;
	LPC_IOCON-›PIO0_8 = 0xD1;
	LPC_SYSCON-›PRESETCTRL |= 0x01;
	LPC_SYSCON-›SYSAHBCLKCTRL |= (1‹‹11);
	LPC_SYSCON-›SSP0CLKDIV = 0x02;
	LPC_SSP0-›CR0 = 0x0707;
	LPC_SSP0-›CR1 = 0x02;
	LPC_SSP0-›CPSR = 0x02;
	// init additional gpio for spi0
	LPC_GPIO0-›DIR |= (1‹‹1)|(1‹‹2)|(1‹‹3)|(1‹‹6)|(1‹‹7);
отправка байта:

Код:
void SPISend(char bt)
{
	while ((LPC_SSP0-›SR & 0x12) != 0x02);
	LPC_SSP0-›DR = bt;
	while ((LPC_SSP0-›SR & 0x10) == 0x10);
}
прием байта:

Код:
uint8_t SPIReceive()
{
	uint8_t RetVal;
	while ((LPC_SSP0-›SR & 0x10) == 0x10);
	LPC_SSP0-›DR = 0xFF;
	while ((LPC_SSP0-›SR & 0x1C) != 0x0C){
	};
	Transmit_UART_Lenght = Convert_To_UART(0x0E);
	UARTSend(Transmit_UART_Buffer, Transmit_UART_Lenght);
	RetVal = LPC_SSP0-›DR;
	return RetVal;
}
запись в память: NumIC - это номер микросхемки на шине, у меня их 3, Addr - адрес в микросхемке, Data - что надо записать.

Код:
void WriteToSPI(uint8_t NumIC, uint32_t Addr, uint8_t Data)
{
	char bt;
	
	LPC_GPIO0-›MASKED_ACCESS[0x04] =0x00; // устанавливаем в 1 CS микросхемы памяти. У меня по дороге к ней стоит инвертор, потому пишем 0.
	switch (NumIC) // здесь выбираем конкретную микросхему
	{
		case 0x01:
			LPC_GPIO0-›MASKED_ACCESS[0xCA] = (1‹‹1);
			break;
		case 0x02:
			LPC_GPIO0-›MASKED_ACCESS[0xCA] = (1‹‹3);
			break;
		case 0x03:
			LPC_GPIO0-›MASKED_ACCESS[0xCA] = (1‹‹6);
			break;
		case 0x04:
			LPC_GPIO0-›MASKED_ACCESS[0xCA] = (1‹‹7);
			break;
	}
	LPC_GPIO0-›MASKED_ACCESS[0x04] =0x04;   //устанавливаем в 0 CS микросхемы памяти
	SPISend(0x06); //WREN
	LPC_GPIO0-›MASKED_ACCESS[0x04] =0x00;
	delay_ns(250);
	while (1) // test if IC ready to write
	{
 		LPC_GPIO0-›MASKED_ACCESS[0x04] =0x04;
		SPISend(0x05); //RDSR
		bt = SPIReceive();
		LPC_GPIO0-›MASKED_ACCESS[0x04] =0x00;
		if ((bt&0x03)==0x02)
		{
			break;
		}
	}
	// start write cycle
	LPC_GPIO0-›MASKED_ACCESS[0x04] =0x04;
	SPISend(0x02);
	SPISend((uint8_t)((Addr››16)&0xFF));
	SPISend((uint8_t)((Addr››08)&0xFF));
	SPISend((uint8_t)(Addr&0xFF));
	SPISend(Data);
	LPC_GPIO0-›MASKED_ACCESS[0x04] =0x00;
	delay_ns(65000);
	while (1) // test if IC had been written
	{
		LPC_GPIO0-›MASKED_ACCESS[0x04] =0x04;
		SPISend(0x05); //RDSR
		bt = SPIReceive();
		LPC_GPIO0-›MASKED_ACCESS[0x04] =0x00;
		if ((bt&0x01)!=0x01)
		{
			break;
		}
	}
	return;
}
Реклама:

Последний раз редактировалось cel128; 18.06.2012 в 09:58.
cel128 вне форума  
Сказали "Спасибо" cel128
warel (29.06.2019)
Непрочитано 18.06.2012, 09:50  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: lpc1114 и spi eeprom m95m01

Нормально свой код оформите, а то глаза режет.
Вот пример для 2ххх.
Код:
#include "LPC21xx.h"
#include "spi.h"

void SPI_Init(void)
{
	PINSEL0|=(1‹‹8)|(1‹‹10)|(1‹‹12);													//enable alternative functions for SPI
	IO0DIR|=CS_PIN;																		//CS PIN for OUTPUT
	S0SPCR=(1‹‹4)|(1‹‹5)|(1‹‹11);														//configure SPI
	S0SPCCR=0x10;																		//clock devider
	IO0SET=CS_PIN;																		//CS_PIN HIGH
}
unsigned char SPI_Read (unsigned char Data)
{
	S0SPDR=Data;
	while((S0SPSR&(1‹‹7))==0);
	S0SPSR&=(~(1‹‹7));
	return S0SPDR;
}
Easyrider83 вне форума  
Сказали "Спасибо" Easyrider83
warel (29.06.2019)
Непрочитано 18.06.2012, 21:20  
st__1
Заблокирован
 
Регистрация: 31.12.2011
Сообщений: 726
Сказал спасибо: 32
Сказали Спасибо 223 раз(а) в 162 сообщении(ях)
st__1 на пути к лучшему
По умолчанию Re: lpc1114 и spi eeprom m95m01

Одно другого лучше...
st__1 вне форума  
Сказали "Спасибо" st__1
warel (29.06.2019)
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с EEPROM по SPI dominik2 Микроконтроллеры, АЦП, память и т.д 15 05.05.2012 00:24
Простейший программатор SPI EEPROM dimmich Микроконтроллеры, АЦП, память и т.д 6 09.08.2010 23:08
SPI eeprom 95p08 и 95080 ipkin Микроконтроллеры, АЦП, память и т.д 1 11.06.2008 23:52
Инициализация SPI-EEPROM в Proteus 7.1 slavik_1234 Микроконтроллеры, АЦП, память и т.д 0 10.09.2007 21:19
Какую память выбрать EEPROM/Flash с SPI/I2C? graham Микроконтроллеры, АЦП, память и т.д 9 17.11.2005 19:17


Часовой пояс GMT +4, время: 09:52.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot