TMS320C6657上的 SPI 外设所需的文档:接口寄存器定义。
文献编号:SPRUGP2A,2012年3月--包括大量未定义的内容。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
TMS320C6657上的 SPI 外设所需的文档:接口寄存器定义。
文献编号:SPRUGP2A,2012年3月--包括大量未定义的内容。
您好、Genady
[引用 userid="548439" URL"~/support/processors-group/processors/f/processors-forum/1194695/tms320c6657-tms320c6657-spi "] TMS320C6657上的 SPI 外设所需的文档:接口寄存器定义。[/quot]在下面的产品页面中、当我们单击"View-All"选项时、有80个技术文档。 这些是 C6657的唯一文档。
https://www.ti.com/lit/ug/sprugp2a/sprugp2a.pdf
SPRUGP2A -本文献是 SPI 的主要文档。
[引用 userid="548439" URL"~/support/processors-group/processors/f/processors-forum/1194695/tms320c6657-tms320c6657-spi ]\n 文献 编号:SPRUGP2A,2012年3月--包括大量未定义的内容。要详细了解您的查询,请指出“未定义”吗?
此致
Shankari G
Genady、
美好的一天!
我可以对 SPI-NOR 工作代码进行实验并验证 SPIPC0寄存器。
无需将 SPIPC1更改为 SPIPC7 --- >表示 C6657、不像 C674x/omapl13x。
--
更具体地说、如果我们将值"0x00000E01"设置到 SPIPC0寄存器、则会在内部进行处理并将值设置为"0x01010E01"。
用户无需考虑位12 - 31、因为它们是保留位。
--
最佳配置将只是设置"SPIPC0"--- (不需要任何其他-- SPIPC1至 SPIPC7)。
---- >数据表似乎是正确的、只有"SPIPC0"--> https://www.ti.com/lit/ug/sprugp2a/sprugp2a.pdf -->第号:37页
#define CSL_SPI_SPIPC0_SCS0FUN0_SHIFT (((uint32_t) 0x00000000u)
#define CSL_SPI_SPIPC0_CLKFUN_SHIFT (((uint32_t) 0x00000009u)
#define CSL_SPI_SPIPC0_SIMOFUN_SHIFT (((uint32_t) 0x0000000Au)
#define CSL_SPI_SPIPC0_SOMIFUN_SHIFT (((uint32_t) 0x0000000BU)
#define CSL_SPI_SPIPC0_SCS0FUN0_SPI ((uint32_t) 0x00000001u)
#define CSL_SPI_SPIPC0_CLKFUN_SPI (((uint32_t) 0x00000001u)
#define CSL_SPI_SPIPC0_SIMOFUN_SPI ((uint32_t) 0x00000001u)
#define CSL_SPI_SPIPC0_SOMIFUN_SPI ((uint32_t) 0x00000001u)
SPI_SPIPC0 =(CSL_SPI_SPIPC0_SCS0FUN0_SPI <<CSL_SPI_SPIPC0_SCS0FUN0_SHIFT)|
(CSL_SPI_SPIPC0_CLKFUN_SPI <<CSL_SPI_SPIPC0_CLKFUN_SHIFT)|
(CSL_SPI_SPIPC0_SIMOFUN_SPI <<CSL_SPI_SPIPC0_SIMOFUN_SHIFT)|
(CSL_SPI_SPIPC0_SOMIFUN_SPI <<CSL_SPI_SPIPC0_SOMIFUN_SHIFT);
--
以下配置是 SPI 接口的完整工作配置。
/*********
*
*函数:SPI_Claim
*
*说明:此函数声明 SPI 控制器中的 SPI 总线
*
*参数:uint32 cs -用于从 SPI 器件的芯片选择号
* uint32 freq - SPI 时钟频率
*
*返回值:错误状态
*
秘书长的报告 /
SPI_STATUS
SPI_Claim
(
uint32_t cs、
uint32_t freq
)
{
uint32_t 标量;
PLIBSPILOCK()
/*启用 SPI 硬件*/
SPI_SPIGCR0 = CSL_SPI_SPIGCR0_RESET_IN_RESET;
SPI_DELAY (2000);
SPI_SPIGCR0 = CSL_SPI_SPIGCR0_RESET_OUT_ON_RESET;
/*设置主模式、加电且未激活*/
SPI_SPIGCR1 =(CSL_SPI_SPIGCR1_MASTER_MASTER << CSL_SPI_SPIGCR1_MASTER_SHIFT)|
(CSL_SPI_SPIGCR1_CLKMOD_INTERNAL << CSL_SPI_SPIGCR1_CLKMOD_SHIFT);
/* CS0、CS1、CLK、从器件输入和从器件输出是功能引脚*/
如果(cs =0){
SPI_SPIPC0 =(CSL_SPI_SPIPC0_SCS0FUN0_SPI <<CSL_SPI_SPIPC0_SCS0FUN0_SHIFT)|
(CSL_SPI_SPIPC0_CLKFUN_SPI <<CSL_SPI_SPIPC0_CLKFUN_SHIFT)|
(CSL_SPI_SPIPC0_SIMOFUN_SPI <<CSL_SPI_SPIPC0_SIMOFUN_SHIFT)|
(CSL_SPI_SPIPC0_SOMIFUN_SPI <<CSL_SPI_SPIPC0_SOMIFUN_SHIFT);
}否则、如果(cs =1){
SPI_SPIPC0 =(((CSL_SPI_SPI_SPIPC0_SCS0FUN1_SPI <<CSL_SPI_SPIPC0_SCS0FUN1_SHIFT)|
(CSL_SPI_SPIPC0_CLKFUN_SPI <<CSL_SPI_SPIPC0_CLKFUN_SHIFT)|
(CSL_SPI_SPIPC0_SIMOFUN_SPI <<CSL_SPI_SPIPC0_SIMOFUN_SHIFT)|
(CSL_SPI_SPIPC0_SOMIFUN_SPI <<CSL_SPI_SPIPC0_SOMIFUN_SHIFT))和0xFFFF;
}
/*设置格式*/
标量=((SPI_MODULE_CLK / freq)-1)& 0xFF;
如果(cs =0){
SPI_SPIFMT0 =(8 <<CSL_SPI_SPIFMT_CHARLEN_SHIFT)|
(标量<< CSL_SPI_SPIFMT_PRESCOLE_SHIFT)|
(CSL_SPI_SPIFMT_PHASE_DELAY << CSL_SPI_SPIFMT_PHASE_SHIFT)|
(CSL_SPI_SPIFMT_POLICLE_LOW << CSL_SPI_SPIFMT_POLICE_SHIFT)|
(CSL_SPI_SPIFMT_SHIFTDIR_MSB <<CSL_SPI_SPIFMT_SHIFTDIR_SHIFT);
}如果(cs =1){
SPI_SPIFMT0 =(16 << CSL_SPI_SPIFMT_CHARLEN_SHIFT)|
(标量<< CSL_SPI_SPIFMT_PRESCOLE_SHIFT)|
(CSL_SPI_SPIFMT_PHASE_NO_DELAY << CSL_SPI_SPIFMT_PHASE_SHIFT)|
(CSL_SPI_SPIFMT_POLICLE_LOW << CSL_SPI_SPIFMT_POLICE_SHIFT)|
(CSL_SPI_SPIFMT_SHIFTDIR_MSB <<CSL_SPI_SPIFMT_SHIFTDIR_SHIFT);
}
/*在传输结束时保持 CS 处于活动状态,直到显式取消置位*/
Data1_REG_val =(CSL_SPI_SPIDAT1_CSHOLD_ENABLE << CSL_SPI_SPIDAT1_CSHOLD_SHIFT)|
(0x02 <<CSL_SPI_SPIDAT1_CSNR_SHIFT);
如果(cs =0){
SPI_SPIDAT1 =(CSL_SPI_SPIDAT1_CSHOLD_ENABLE << CSL_SPI_SPIDAT1_CSHOLD_SHIFT)|
(0x02 <<CSL_SPI_SPIDAT1_CSNR_SHIFT);
}
/*包括轻微延迟。 这里没有科学。 也应该很好
*无延迟
*
如果(cs =0){
SPI_SPIDELAY =(8 <<CSL_SPI_SPIDELAY_C2TDELAY_SHIFT)|
(8 <<CSL_SPI_SPIDELAY_T2CDELAY_SHIFT);
/*默认芯片选择寄存器*/
SPI_SPIDEF = CSL_SPI_SPIDEF_RESETVAL;
}否则、如果(cs =1){
SPI_SPIDELAY =(6 <<CSL_SPI_SPIDELAY_C2TDELAY_SHIFT)|
(3 <<CSL_SPI_SPIDELAY_T2CDELAY_SHIFT);
}
/*无中断*/
SPI_SPIINT0 = CSL_SPI_SPIINT0_RESETVAL;
SPI_SPILVL = CSL_SPI_SPILVL_RESETVAL;
/*启用 SPI */
SPI_SPIGCR1|=(CSL_SPI_SPIGCR1_ENABLE_ENABLE << CSL_SPI_SPIGCR1_ENABLE_SHIFT);
如果(cs =1){
SPI_SPIDAT0 = 1 << 15;
SPI_DELAY (10000);
/*读取 SPIFLG、等待直到 RX 完全中断*/
IF (((SPI_SPIFLG &(CSL_SPI_SPI_SPI_SPIFLG_RXINTFLG_FULL_<<CSL_SPI_SPIFLG_RXINTFLG_SHIFT)) ) { )
/*读取一个字节数据*/
标量= SPI_SPIBUF & 0xFF;
/*清除数据*/
SPI_SPIBUF = 0;
}
否则{
/*读取一个字节数据*/
标量= SPI_SPIBUF & 0xFF;
返回 SPI_EFAIL;
}
}
返回 SPI_Eok;
}
/********* /
----------
为了验证这一点、我进行了一个小实验。
例如、
1.将一些虚拟值(如0x00000001)设置到 SPIPC0
2.在内存浏览器中将 SPIPC0寄存器的值可视化,地址 为0x20BF0014 -->它将显示为0x00000001
3.将值设置为0x00000E01 --- > APT 配置到 SPIPC0
4. 在存储器浏览器中将 SPIPC0寄存器的值可视化、地址 为0x20BF0014 -->该值将显示为0x01010E01
--
我希望这对您有所帮助!
此致
Shankari G