//spi數據寫入驅動
void SPI_SEND_BYTE(uint8_t data)
{
uint8_t i = 0;
uint8_t tmp = data;
for (i = 0; i < 8; i++)
{
SIMU_SPI_SCK_L();
sleep_us(1);
if (tmp & 0x80)
{
SIMU_SPI_SDA_H();
}
else
{
SIMU_SPI_SDA_L();
}
sleep_us(1);
SIMU_SPI_SCK_H();
sleep_us(1);
tmp <<= 1;
sleep_us(1);
}
}
//spi數據讀取驅動
uint16_t SPI_RECV_BYTE(void)
{
uint16_t data = 0;
uint8_t i = 0;
SIMU_SPI_SDA_INPUT();
SIMU_SPI_SCK_L();
for (i = 0; i < 16; i++)
{
sleep_us(1);
data <<= 1;
sleep_us(1);
SIMU_SPI_SCK_H();
sleep_us(1);
if (IS_SIMU_SPI_SDA_H())
{
data |= 0x01;
}
sleep_us(1);
SIMU_SPI_SCK_L();
}
SIMU_SPI_SDA_OUTPUT();
return data;
}
//寫寄存器數據
void WriteReg_shell(uint8_t addr, uint16_t word)
{
SIMU_SPI_SDA_OUTPUT();
SIMU_SPI_SCK_L();
SPI_NSS_ACTIVE();
uint16_t temp = word >> 8;
SPI_SEND_BYTE(addr);
SPI_SEND_BYTE((temp)&0xFF);
SPI_SEND_BYTE((word)&0xFF);
SPI_NSS_INACTIVE();
}
//讀寄存器數據
uint16_t ReadReg_shell(uint8_t addr)
{
uint16_t word;
SIMU_SPI_SDA_OUTPUT();
SIMU_SPI_SCK_L();
SPI_NSS_ACTIVE();
uint8_t tmp_addr = (addr | 0x80);
SPI_SEND_BYTE(tmp_addr);
sleep_us(2);
word = SPI_RECV_BYTE();
SPI_NSS_INACTIVE();
return word;
}
代碼說明:
前面兩個函數是讀取/寫入的時序
后面兩個函數是讀取設備寄存器的demo代碼
其中需要注冊進去的接口
一、設置spi clk引腳高低
SIMU_SPI_SCK_H();
SIMU_SPI_SCK_L();
二、設置spi data引腳高低
SIMU_SPI_SDA_H();
SIMU_SPI_SDA_L();
三、設置spi data引腳輸入輸出模式
SIMU_SPI_SDA_OUTPUT();
SIMU_SPI_SDA_INPUT();
四、設置spi NSS引腳高低(spi使能)
SPI_NSS_ACTIVE();//拉低開啟使能
SPI_NSS_INACTIVE();//拉高關閉使能