lua语言呢是 spi.setup(id, mode, cpol, cpha, databits, clock_div[, duplex_mode])
去源码里面看看
代码语言:javascript复制/******************************************************************************
* FunctionName : spi_master_init
* Description : SPI master initial function for common byte units transmission
* Parameters : uint8 spi_no - SPI module number, Only "SPI" and "HSPI" are valid
*******************************************************************************/
void spi_master_init(uint8 spi_no, unsigned cpol, unsigned cpha, uint32_t clock_div)
{
uint32 regvalue;
if(spi_no>1) return; //handle invalid input number
SET_PERI_REG_MASK(SPI_USER(spi_no), SPI_CS_SETUP|SPI_CS_HOLD|SPI_RD_BYTE_ORDER|SPI_WR_BYTE_ORDER);
// set clock polarity (Reference: http://bbs.espressif.com/viewtopic.php?f=49&t=1570)
// phase is dependent on polarity. See Issue #1161
if (cpol == 1) {
SET_PERI_REG_MASK(SPI_PIN(spi_no), SPI_IDLE_EDGE);
} else {
CLEAR_PERI_REG_MASK(SPI_PIN(spi_no), SPI_IDLE_EDGE);
}
//set clock phase
if (cpha == cpol) {
// Mode 3: MOSI is set on falling edge of clock
// Mode 0: MOSI is set on falling edge of clock
CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_CK_OUT_EDGE);
} else {
// Mode 2: MOSI is set on rising edge of clock
// Mode 1: MOSI is set on rising edge of clock
SET_PERI_REG_MASK(SPI_USER(spi_no), SPI_CK_OUT_EDGE);
}
CLEAR_PERI_REG_MASK(SPI_USER(spi_no), SPI_FLASH_MODE|SPI_USR_MISO|SPI_USR_ADDR|SPI_USR_COMMAND|SPI_USR_DUMMY);
//clear Dual or Quad lines transmission mode
CLEAR_PERI_REG_MASK(SPI_CTRL(spi_no), SPI_QIO_MODE|SPI_DIO_MODE|SPI_DOUT_MODE|SPI_QOUT_MODE);
spi_set_clkdiv(spi_no, clock_div);
if(spi_no==SPI){
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, 1);//configure io to spi mode
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CMD_U, 1);//configure io to spi mode
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA0_U, 1);//configure io to spi mode
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA1_U, 1);//configure io to spi mode
}
else if(spi_no==HSPI){
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 2);//configure io to spi mode
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, 2);//configure io to spi mode
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, 2);//configure io to spi mode
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, 2);//configure io to spi mode
}
}
使用(作为主机)
代码语言:javascript复制spi_master_init(1, 0, 0, 0)
1:HSPI
0:时钟信号(CLK引脚)在空闲时是低电平
0:数据在时钟信号(CLK)的第1个沿开始数据传输
0:0分频,就是80MHZ
发送数据
加点解释
比如向从机发送0xaa,0x55,0x02,0x01
spi.send(1,0xaa,0x55,0x02,0x01)
发送0xaa,0x55,0x02,0x01
发现没
不用理会这些,,,再怎么则只是SPI传输数据罢了
再怎么搞也是SPI通信......SPI_MOSI引脚发送数据的时候,可以判断SPI_MISO引脚的电平接收数据
给大家个我写的史上最简单的SPI通信函数例子给大家压压惊
SPI_MOSI : 发送数据引脚
SPI_MISO : 接收数据引脚
SPI_CLK : 时钟引脚
代码语言:javascript复制/**
* @brief SPI函数
* @param value--发送的数据
* @param None
* @param None
* @retval SPI接收的数据
* @example
**/
unsigned char SPIWriteRead(unsigned char value)
{
unsigned char i=0,temp=0;
SPI_CLK = 0;//进入之前其实是高电平
if(SPI_MISO)temp|=0x80;//接收数据
for(i=0;i<8;i )
{
SPI_MOSI=value&(0x80>>i);//准备数据
SPI_CLK=1;
SPI_CLK = 0;
if(i<7)if(SPI_MISO)temp|=0x80>>(i 1);//接收数据
}
return temp;
}
比如向从机发送data = 0xaa;
第一种: spi_mast_transaction(1, 8, data , 0, 0,0, 0, 0);
不要有任何疑问....再怎么着只是SPI发送数据而已
第二种: spi_mast_transaction(1, 0, 0, 8, data,0, 0, 0);
第三种: spi_mast_transaction(1, 0, 0, 0, 0,8, data, 0);
那很多人就疑问了
这不是命令 地址吗....
哎呀 什么命令地址,就是要发送的数据罢了.
我有个SPI的从机模块,假设模块地址 0x00 里面有数据,
想设置里面的数据需要先发0x00,
让芯片知道设置的地址是0x00地址
然后发送要设置的数据.
实际上怎么做???
先用SPI发送个 0x00
然后再发送设置的数据.
正常的话应该发送两次SPI数据
但是呢封装好了
spi_mast_transaction(1, 0, 0, 8, (0x00),8, (0xff), 0); 假设设置为0xFF
有些人还问,为啥前面还有命令???
我有个SPI的从机模块,假设模块设置的地址 0x00 里面有数据,这个地址里面的数据可以设置可以读取
我想设置怎么办???先发个设置指令 假设是0xAA吧(注:芯片手册会说的)
然后呢发送0x00 告诉他是设置0x00里面的信息
然后再发设置的数据
正常的话应该发送三次SPI数据
但是呢封装好了
spi_mast_transaction(1, 8, (0xAA), 8, (0x00),8, (0xff), 0); 假设设置为0xFF
所有的都封装好了.可以直接把SPI.C 和SPI.H直接拷贝过去用
不过我发现,RTOS版本的也自带
那就不用拷贝了...
不过我发现 初始化里面没有设置引脚
所以把设置引脚拷贝过来了
代码语言:javascript复制 //拷贝的lua里面的配置引脚
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_HSPIQ_MISO);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_HSPI_CS0);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_HSPID_MOSI);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_HSPI_CLK);
spiConfig.mode = SpiMode_Master;//主机
spiConfig.speed = SpiSpeed_20MHz;//时钟频率
spiConfig.subMode = SpiSubMode_0;//时钟信号(CLK引脚)在空闲时是低电平
spiConfig.bitOrder = SpiBitOrder_MSBFirst;//数据在时钟信号(CLK)的第1个沿开始数据传输
SPIInit(SpiNum_HSPI,&spiConfig);//初始化SPI
发送数据
代码语言:javascript复制 u8 data[4] = { 0xaa, 0x55,0x00,0x01};
SpiSend.addr=0;
SpiSend.addrLen=0;
SpiSend.cmd=0;
SpiSend.cmdLen=0;
SpiSend.data=&data;
SpiSend.dataLen=4;
SPIMasterSendData(SpiNum_HSPI,&data);
这节只是做下记录..............
等我新板子到了,我便测试整改教程,把lua和SDK同时开进,源码还是公开.
Android 和 C# 单独拿出来讲解,不再混到一块了.